无法配置Spring Caffeine缓存管理器

我有一个spring boot项目,它用作其他项目的库(打包的jar文件)。我正在尝试配置咖啡因缓存,该缓存将在对服务发出请求后异步刷新。

pom.xml(包括):

<dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
</dependency>

我的配置类:

@EnableCaching
@Configuration
public class caffeineCacheConfig {

@Bean
public CacheManager cacheManager(){
    caffeineCacheManager cacheManager = new caffeineCacheManager("userStories","features");
    cacheManager.setcaffeine(caffeineCacheBuilder());
    cacheManager.setallowNullValues(false);
    return cacheManager;
}

caffeine<Object,Object> caffeineCacheBuilder() {
    return caffeine.newBuilder()
            .initialCapacity(100)
            .maximumSize(500)
            .refreshAfterWrite(1,TimeUnit.MINUTES)
            .weakKeys()
            .recordStats();
}
}

DAO层(需要在此处缓存):

@Component
@EnableCaching
@CacheConfig(cacheNames = {"userStories"})
public class UserStoryDaoImpl implements IUserStoryDao {

@Override
@Cacheable
public List<UserStory> getUserStoriesForProjectAndRelease(UserDto userDto,Set<Integer> reportProjectId,int releaseId) {
    return new ArrayList(); //slow and low performing method that returns a list
}

DAO层(也需要在此处缓存):

@Component
@EnableCaching
@CacheConfig(cacheNames = {"features"})
public class FeatureDaoImpl implements IFeatureDao {

@Override
@Cacheable
public List<Features> geFeaturesForProjectAndRelease(UserDto userDto,int releaseId) {
    return new ArrayList(); //slow and low performing method that returns a list
}
}

在运行此设置时,我进入错误堆栈以下:

2020-03-31 16:55:46,020 ERROR web.context.ContextLoader     - Context initialization failed [localhost-startStop-1] {}
java.lang.NullPointerException
    at org.springframework.context.annotation.AutoProxyRegistrar.registerBeanDefinitions(AutoProxyRegistrar.java:62)
    at org.springframework.context.annotation.ConfigurationClassparser.processImport(ConfigurationClassparser.java:385)
    at org.springframework.context.annotation.ConfigurationClassparser.processImport(ConfigurationClassparser.java:377)
    at org.springframework.context.annotation.ConfigurationClassparser.doProcessConfigurationClass(ConfigurationClassparser.java:205)
    at org.springframework.context.annotation.ConfigurationClassparser.processConfigurationClass(ConfigurationClassparser.java:164)
    at org.springframework.context.annotation.ConfigurationClassparser.parse(ConfigurationClassparser.java:130)
    at org.springframework.context.annotation.ConfigurationClasspostProcessor.processConfigBeanDefinitions(ConfigurationClasspostProcessor.java:287)
    at org.springframework.context.annotation.ConfigurationClasspostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClasspostProcessor.java:225)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:632)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:461)
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410)
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112)
    at com.intland.codebeamer.context.CodeBeamerContextListener.lambda$contextInitialized$1(CodeBeamerContextListener.java:117)
    at com.intland.codebeamer.context.CodeBeamerContextListener.logExecutionTime(CodeBeamerContextListener.java:148)
    at com.intland.codebeamer.context.CodeBeamerContextListener.contextInitialized(CodeBeamerContextListener.java:117)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4699)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5165)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.Futuretask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
2020-03-31 16:55:46,070 INFO  codebeamer.context.CodeBeamerContextListener     - Context - Destroyed [localhost-startStop-1] {}
2020-03-31 16:55:46,132 WARN  context.support.XmlWebApplicationContext     - Exception thrown from ApplicationListener handling ContextClosedEvent [localhost-startStop-1] {}
java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Tue Mar 31 16:55:35 IST 2020]; root of context hierarchy
    at org.springframework.context.support.AbstractApplicationContext.getapplicationEventMulticaster(AbstractApplicationContext.java:347)
    at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:334)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1051)
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1012)
    at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:586)
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143)
    at com.intland.codebeamer.context.CodeBeamerContextListener.contextDestroyed(CodeBeamerContextListener.java:128)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4746)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5403)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.Futuretask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
2020-03-31 16:55:46,132 WARN  context.support.XmlWebApplicationContext     - Exception thrown from LifecycleProcessor on context close [localhost-startStop-1] {}
java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Tue Mar 31 16:55:35 IST 2020]; root of context hierarchy
    at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:360)
    at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1059)
    at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1012)
    at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:586)
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143)
    at com.intland.codebeamer.context.CodeBeamerContextListener.contextDestroyed(CodeBeamerContextListener.java:128)
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4746)
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5403)
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:714)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1125)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1859)
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
    at java.util.concurrent.Futuretask.run(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

不确定设置中缺少什么?

xiaomading 回答:无法配置Spring Caffeine缓存管理器

首先从@EnableCaching类中删除@Component-保留 只能在@Configuration上使用。

通常不确定@CacheConfig 您可以在@Cacheable中配置缓存名称。

我以前对您的想法有经验。这里的问题在于,刷新缓存需要一种方法来进行刷新-一种将基于键生成最新值的方法。当密钥基于方法签名中的多个参数时,实现这种方法很棘手。同样,这意味着值加载机制应该实现两次:在带注释的方法中和在重新加载器中。

本文链接:https://www.f2er.com/2544077.html

大家都在问