未使用new关键字初始化在Spring组件中创建的字段

hmtdttj4  于 2022-11-29  发布在  Spring
关注(0)|答案(3)|浏览(175)

我有一个用@Component注解的spring组件类,其中有ConcurrentHashMapMap字段,它是组件构造函数中的init,并在spring流侦听器中使用:

  1. @Component
  2. public class FooService {
  3. private ConcurrentHashMap<Long, String> fooMap;
  4. public FooService () {
  5. fooMap = new ConcurrentHashMap<>();
  6. }
  7. @StreamListener(value = Sink.INPUT)
  8. private void handler(Foo foo) {
  9. fooMap.put(foo.id, foo.body);
  10. }
  11. }

侦听器处理由rest控制器发送消息您能告诉我为什么总是出现fooMap.put(...) NullPointerException,因为fooMap为null并且没有初始化吗

编辑:

在@ OlgZhurakousky回答后,我发现问题出在异步方法上。当我在某个方法上添加@Async并添加@EnableAsync时,我无法再为我的@StreamListener方法使用私有修改器。您知道为什么以及如何修复它吗?https://github.com/schwantner92/spring-cloud-stream-issue谢谢。

vmjh9lq9

vmjh9lq91#

@Denis Stephanov当我说最低限度的时候,我的意思是。所以试着从这个开始,你会发现Map不是空的,然后从那里开始进化你的应用程序。

  1. @SpringBootApplication
  2. @EnableBinding(Processor.class)
  3. public class DemoApplication {
  4. private final Map<String, String> map;
  5. public static void main(String[] args) {
  6. SpringApplication.run(DemoRabbit174Application.class, args);
  7. }
  8. public DemoApplication() {
  9. this.map = new HashMap<>();
  10. }
  11. @StreamListener(Processor.INPUT)
  12. public void sink(String string) {
  13. System.out.println(string);
  14. }

}

展开查看全部
3zwjbxry

3zwjbxry2#

对于Spring,一切都必须注入。
你需要为ConcurrentHashMap声明一个@Bean,它将被注入到你的Component中。所以创建一个Configuration类,如下所示:

  1. @Configuration
  2. public class FooMapConfiguration {
  3. @Bean("myFooMap")
  4. public ConcurrentHashMap<Long, String> myFooMap() {
  5. return new ConcurrentHashMap<>();
  6. }
  7. }

然后修改您的Component

  1. @Component
  2. public class FooService {
  3. @Autowired
  4. @Qualifier("myFooMap")
  5. private ConcurrentHashMap<Long, String> fooMap;
  6. public FooService () {
  7. }
  8. @StreamListener(value = Sink.INPUT)
  9. private void handler(Foo foo) {
  10. fooMap.put(foo.id, foo.body); // <= No more NPE here
  11. }
  12. }
展开查看全部
mnemlml8

mnemlml83#

您可以尝试使用@PostConstruct而不是构造函数吗?

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

相关问题