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

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

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

@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);
    }
}

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

编辑:

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

vmjh9lq9

vmjh9lq91#

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

@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);
    }

}

3zwjbxry

3zwjbxry2#

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

@Configuration
public class FooMapConfiguration {

    @Bean("myFooMap")
    public ConcurrentHashMap<Long, String> myFooMap() {
        return new ConcurrentHashMap<>();
    }

}

然后修改您的Component

@Component
public class FooService {

    @Autowired
    @Qualifier("myFooMap")
    private ConcurrentHashMap<Long, String> fooMap;

    public FooService () {         
    }

    @StreamListener(value = Sink.INPUT)
    private void handler(Foo foo) {
        fooMap.put(foo.id, foo.body); // <= No more NPE here
    }
}
mnemlml8

mnemlml83#

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

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

相关问题