这个问题在这里已经有答案了:
为什么我的spring@autowired字段为空(22个答案)
24天前关门。
我使用ehcache作为缓冲区来传递连接到websocket(spring)的所有客户机的数据。
cacheeventlistener实现:
public class CacheListener implements CacheEventListener<ArrayList, MeasurementPoint> {
@Autowired
private SimpMessagingTemplate simpMessagingTemplate; //<-- This is null at runtime
@Override
public void onEvent(CacheEvent<? extends ArrayList, ? extends MeasurementPoint> cacheEvent) {
simpMessagingTemplate.convertAndSend("/topic/measurementsPoints", cacheEvent.getNewValue());
}
}
ehcache配置xml:
config
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xmlns='http://www.ehcache.org/v3'
xsi:schemaLocation="
http://www.ehcache.org/v3
http://www.ehcache.org/schema/ehcache-core-3.7.xsd">
<!-- Default cache template -->
<cache-template name="default">
<resources>
<heap>1000</heap>
<offheap unit="MB">10</offheap>
</resources>
</cache-template>
<cache alias="measurementsCache" uses-template="default">
<key-type>java.util.ArrayList</key-type>
<value-type>br.com.petrobras.risersupervisory.model.MeasurementPoint</value-type>
<listeners>
<listener>
<class>br.com.petrobras.risersupervisory.framework.CacheListener</class>
<event-firing-mode>ASYNCHRONOUS</event-firing-mode>
<event-ordering-mode>UNORDERED</event-ordering-mode>
<events-to-fire-on>CREATED</events-to-fire-on>
<events-to-fire-on>UPDATED</events-to-fire-on>
</listener>
</listeners>
</cache>
</config>
我尝试过学习一些教程,但它们都在cacheeventlistener实现中使用日志库或system.out.println。
有没有办法在cacheeventlistener中自动连接@service(spring)?这个实现错了吗?在cacheeventlistener中,我找不到一个使用@autowired的例子。
obs:不仅simpmessagingtemplate在运行时为空。我也尝试过自动连接一个自定义类,结果是一样的。
obs2:在搜索了spring引导日志之后,我相信cacheeventlistener在spring引导完成加载之前已经绑定到了缓存。不确定这是否是问题所在。
1条答案
按热度按时间ymdaylpp1#
obs2:在搜索了spring引导日志之后,我相信cacheeventlistener在spring引导完成加载之前已经绑定到了缓存。不确定这是否是问题所在。
这暗示了您的问题,您不能将springbean注入到非spring托管对象示例中。您可以使用一个简单的类为您提供对spring上下文的静态访问,以加载这里描述的bean。
如果在初始化spring上下文之前尝试这样做,可能仍然存在问题。值得一提的是
spring-boot
通过支持ehcache 3.xorg.springframework.boot:spring-boot-starter-cache
附属国。我不知道这是否适合您的目的,但如果ehcache与spring集成,可能会更容易。