使用@Cacheable注释时无法加载ApplicationContext

时间:2018-01-24 16:06:28

标签: java spring caching javabeans ehcache

我正在将缓存集成到我的Web应用程序中,但由于某些原因,在添加@Cacheable注释时无法加载应用程序上下文。

我一直试图解决这个问题两天了,非常感谢你的帮助!

app.context.xml

const template = ({title, lead, description}) => `<div class="classes" data-class="XII">
  <button onclick="tog('XII')" class="btn btn-block text-mono btn-outline-secondary">XII</button>
    <div id="XII" style="display: none;">
        <div class="card mb-3 text-center bg-secondary text-light border-0">
            <div class="card-body">
                <blockquote class="card-blockquote">
                    <h2 class="display-4">${title}</h2>
                    <hr class="my-4">
                    <p class="lead">${lead}</p>
                    <p>${description}</p>
                    <button class="btn btn-shadow text-mono btn-danger">Delete</button>
                </blockquote>
            </div>
        </div>
    </div>
</div>`;
const $html = $(template({
  title: 'my title',
  lead: 'my lead',
  description: 'my description'
});

ehcache.xml中

<cache:annotation-driven cache-manager="EhCacheManagerBean" key-generator="customKeyGenerator" />

<bean id="EhCacheManagerBean" class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcacheBean" />

<bean id="ehcacheBean" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:configLocation="classpath:EhCache.xml" p:shared="true" />

<bean id ="customKeyGenerator" class="com.app.site.v2.cache.customKeyGenerator"/>

<bean id="siteService" class="com.app.site.v2.SiteService" primary="true"/>

正在缓存的方法

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
     updateCheck="true"
     monitoring="autodetect"
     dynamicConfig="true">

<diskStore path="java.io.tmpdir" />

<cache name="cacheSite"
       maxEntriesLocalHeap="100"
       maxEntriesLocalDisk="1000"
       eternal="false"
       timeToIdleSeconds="300"
       timeToLiveSeconds="600"
       memoryStoreEvictionPolicy="LFU"
       transactionalMode="off">
    <persistence strategy="localTempSwap" />
</cache>

被抛出的异常

public class SiteService implements ISiteService {

    @Cacheable("cacheSite")
        public JsonObject getSiteJson(String siteId, boolean istTranslated) { ... }

}

1 个答案:

答案 0 :(得分:0)

@yegdom的评论实际上是正确的答案。添加Cacheable注释时,Spring会生成一个实现ISiteService的代理。在代码的某处,你有一个需要SiteService的bean,即实现。

有三种解决方案(按优先顺序):

  • 删除无用的界面......单个实现只是增加复杂性而没有直接的好处。删除它将强制Spring使用类代理
  • 修复您的依赖关系以使用ISiteService
  • proxy-target-class="true"添加到cache:annotation-driven,告诉Spring创建一个类代理

我真的不推荐最后一个,因为你应该总是依赖于接口或总是依赖于类(并删除接口)。不是两个在同一时间。