Поле, созданное в компоненте Spring, не инициализировано с новым ключевым словом - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть класс компонента Spring, помеченный @Component, и в нем у меня есть поле ConcurrentHashMap map, которое является init в конструкторе компонента и используется в слушателе потокового источника:

@Component
public class FooService {

    private ConcurrentHashMap<Long, String> fooMap;


    public FooService () {
         fooMap = new ConcurrentHashMap<>();
    }

    @StreamListener(value = Sink.INPUT)
    private void handler(Foo foo) {
        fooMap.put(foo.id, foo.body);
    }
}

Слушатель обрабатывает сообщения, отправленныеконтроллер покоя.Можете ли вы сказать мне, почему я всегда получаю fooMap.put(...) NullPointerException, потому что fooMap имеет значение null и не инициализирован.

РЕДАКТИРОВАТЬ:

После ответа @OlegZhurakousky я обнаружил, что проблема заключается вс асинхронным методом.Когда я добавляю @Async для какого-либо метода и добавляю @EnableAsync, я больше не могу использовать приватный модификатор для моего метода @StreamListener.У вас есть идея, почему и как это исправить?https://github.com/schwantner92/spring-cloud-stream-issue Спасибо.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

@ Денис Стефанов Когда я говорю о минимуме, вот что я имею в виду.Попробуйте для начала, вы увидите, что карта не является нулевой, и начнете развивать ваше приложение оттуда.

@SpringBootApplication
@EnableBinding(Processor.class)
public class DemoApplication {

    private final Map<String, String> map;

    public static void main(String[] args) {
        SpringApplication.run(DemoRabbit174Application.class, args);
    }

    public DemoApplication() {
          this.map = new HashMap<>();
    }

    @StreamListener(Processor.INPUT)
    public void sink(String string) {
        System.out.println(string);
    }

}

0 голосов
/ 17 сентября 2018

Не могли бы вы попробовать использовать @PostConstruct вместо конструктора?

@PostConstruct
public void init(){
    this.fooMap = new ConcurrentHashMap<>();
}
...