1

我有一个必须缓存的方法。我有一个带有 JSR-107 (JCache) 缓存的 SpringBoot 2.1.7 应用程序。使用的缓存实现:EHCache 3.8.0。

@Override
@HystrixCommand(fallbackMethod = "fallbackGetAllUserProfiles")
@Timed(histogram = true, percentiles = {0.75, 0.9, 0.95, 0.99})
@CacheResult
public UserProfiles getAllUserProfiles(@CacheKey String accountID, @CacheKey String userID) {
    return getAllUserProfilesFromBackend(accountID, userID);
}

CacheDefaults(cacheName = "profileCache") 当我使用注释时,该类被注释:@EnableCaching在我的 SpringBoot 入门类上,尝试访问该方法时出现此异常:

java.lang.ClassCastException: Invalid key type, expected : java.lang.String but was : org.springframework.cache.interceptor.SimpleKey
    at org.ehcache.impl.store.BaseStore.checkKey(BaseStore.java:64) ~[ehcache-3.8.0.jar:3.8.0 98c7461621c490ef009548e61849f925305a631f]
    at org.ehcache.impl.internal.store.heap.OnHeapStore.get(OnHeapStore.java:279) ~[ehcache-3.8.0.jar:3.8.0 98c7461621c490ef009548e61849f925305a631f]
    at org.ehcache.core.Ehcache.doGet(Ehcache.java:90) ~[ehcache-3.8.0.jar:3.8.0 98c7461621c490ef009548e61849f925305a631f]
    at org.ehcache.core.EhcacheBase.get(EhcacheBase.java:127) ~[ehcache-3.8.0.jar:3.8.0 98c7461621c490ef009548e61849f925305a631f]
    at org.ehcache.jsr107.Eh107Cache.get(Eh107Cache.java:90) ~[ehcache-3.8.0.jar:3.8.0 98c7461621c490ef009548e61849f925305a631f]
    at org.springframework.cache.jcache.JCacheCache.lookup(JCacheCache.java:77) ~[spring-context-support-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.support.AbstractValueAdaptingCache.get(AbstractValueAdaptingCache.java:58) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:73) ~[spring-context-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.jcache.interceptor.CacheResultInterceptor.invoke(CacheResultInterceptor.java:57) ~[spring-context-support-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.jcache.interceptor.JCacheAspectSupport.execute(JCacheAspectSupport.java:135) ~[spring-context-support-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.jcache.interceptor.JCacheAspectSupport.execute(JCacheAspectSupport.java:112) ~[spring-context-support-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.cache.jcache.interceptor.JCacheInterceptor.invoke(JCacheInterceptor.java:82) ~[spring-context-support-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) ~[spring-aop-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.1.9.RELEASE.jar:5.1.9.RELEASE]
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) ~[spring-aop-5.1.9.RELEASE.jar:5.1.9.RELEASE]

这是缓存规范:

    <cache alias="profileCache">
        <key-type copier="org.ehcache.impl.copy.SerializingCopier">java.lang.String</key-type>
        <value-type copier="org.ehcache.impl.copy.IdentityCopier">java.util.List</value-type>
        <expiry>
            <ttl unit="minutes">5</ttl>
        </expiry>
        <heap unit="entries">10000</heap>
    </cache>

当我将注释更改为它时,@EnableCaching(mode = AdviceMode.ASPECTJ)它确实有效。这是一个错误还是我在这里做错了什么?

4

1 回答 1

3

如果您对没有任何参数但未指定键的方法进行缓存,则会发生此错误。我通过添加一个键解决了这个错误:

@Cacheable(value = "SomeCacheName", key = "#root.methodName")
public List<Country> getCountries() {
    ...
    return countries;
}
于 2020-01-13T20:23:08.003 回答