spring boot 2.x-@autowired服务在自定义cacheeventlistener中为空

deyfvvtc  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(362)

这个问题在这里已经有答案了

为什么我的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引导完成加载之前已经绑定到了缓存。不确定这是否是问题所在。

ymdaylpp

ymdaylpp1#

obs2:在搜索了spring引导日志之后,我相信cacheeventlistener在spring引导完成加载之前已经绑定到了缓存。不确定这是否是问题所在。
这暗示了您的问题,您不能将springbean注入到非spring托管对象示例中。您可以使用一个简单的类为您提供对spring上下文的静态访问,以加载这里描述的bean。

@Component
public class SpringContext implements ApplicationContextAware {

private static ApplicationContext context;

  public static <T extends Object> T getBean(Class<T> beanClass) {
    return context.getBean(beanClass);
  }

  @Override
  public void setApplicationContext(ApplicationContext context) throws BeansException 
  {

    // store ApplicationContext reference to access required beans later on
    SpringContext.context = context;
  }
}

SpringContext.getBean(YourBean.class);

如果在初始化spring上下文之前尝试这样做,可能仍然存在问题。值得一提的是 spring-boot 通过支持ehcache 3.x org.springframework.boot:spring-boot-starter-cache 附属国。我不知道这是否适合您的目的,但如果ehcache与spring集成,可能会更容易。

相关问题