我有一个用@Component
注释的spring组件类,并且在其中有ConcurrentHashMap映射字段,该映射在组件的构造函数中初始化,并在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);
}
}
侦听器处理其余控制器发送的消息。你能告诉我为什么我总是在那里fooMap.put(...)
NullPointerException,因为fooMap为null且未初始化。
编辑:
在@OlegZhurakousky回答之后,我发现问题出在异步方法上。当我在某些方法上添加@Async并添加@EnableAsync时,我无法再对@StreamListener方法使用私有修饰符。您知道为什么以及如何解决它吗? https://github.com/schwantner92/spring-cloud-stream-issue 谢谢。
答案 0 :(得分:0)
您可以尝试使用@PostConstruct代替构造函数吗?
@PostConstruct
public void init(){
this.fooMap = new ConcurrentHashMap<>();
}
答案 1 :(得分:0)
@Denis Stephanov 当我说最低限度时,这就是我的意思。因此,首先尝试一下,您会看到地图不为null,然后从那里开始开发应用程序。
@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);
}
}