在spring组件中创建的字段未使用新关键字

时间:2018-09-17 14:56:53

标签: spring spring-boot constructor spring-cloud-stream

我有一个用@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 谢谢。

2 个答案:

答案 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);
    }

}