【问题标题】:Spring Caching key generatorSpring缓存密钥生成器
【发布时间】:2014-04-24 13:12:19
【问题描述】:

我刚刚开始研究 Spring 缓存。

我的服务方式是……

@Override
@Cacheable(value="profile", **key**="personId" )
public String cpuService2(Long personId, String personAddress){
    return "CachedMessage";
}

没有 key 子句,不会抛出异常,并假设两个参数都自动生成用于缓存 但关键是,当我调用此方法时,会抛出异常...

Exception in thread "main" org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'personId' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject'
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:246)
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:112)
        at org.springframework.expression.spel.ast.PropertyOrFieldReference.getValueInternal(PropertyOrFieldReference.java:107)
        at org.springframework.expression.spel.ast.OpGT.getValueInternal(OpGT.java:37)
        at org.springframework.expression.spel.ast.OpGT.getValueInternal(OpGT.java:29)
        at org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)
        at org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:98)
        at org.springframework.cache.interceptor.ExpressionEvaluator.condition(ExpressionEvaluator.java:99)
        at org.springframework.cache.interceptor.CacheAspectSupport$CacheOperationContext.isConditionPassing(CacheAspectSupport.java:462)
        at org.springframework.cache.interceptor.CacheAspectSupport$CacheOperationContext.isConditionPassing(CacheAspectSupport.java:456)
        at org.springframework.cache.interceptor.CacheAspectSupport.inspectCacheables(CacheAspectSupport.java:292)
        at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:199)
        at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:66)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
        at $Proxy5.cpuService3(Unknown Source)
        at pack100_cache.pack020CacheKey.TestSimpleBean.main(TestSimpleBean.java:34)

搜索了文档但没有任何线索。希望有人能解决这个问题。

【问题讨论】:

    标签: spring caching spring-cache


    【解决方案1】:

    personId 前面缺少#

    @Override
    @Cacheable(value="profile", key="#personId" )
    public String cpuService2(Long personId, String personAddress){
        return "CachedMessage";
    }
    

    caching abstraction chapter 有许多您正在尝试做的事情的示例。

    【讨论】:

    • 谢谢。指的是一些代码错误的博客。
    • 对我来说,在只给出一个单引号后它起作用了,key="'#personId'"
    • 我怀疑它确实如此,那是使用 #personId 作为键(字面意思,不会应用 spel 表达式)
    【解决方案2】:

    当事情变得更复杂时,在容易理解用于生成密钥的算法时,SpEL 可能不是理想的解决方案。 您可以考虑使用 Java 生成密钥:

    @Component
    public class FooGenerator implements KeyGenerator {
        @Override
        public Object generate(Object target, Method method, Object... params) {
            String param = "";
    
            if (params.length == 2) {
                if (params[0] instanceof String) {
                    param = (String) params[0];
    
            String key = "FooKeyEquatesTo" + param;
            return key;
    }
    

    然后你可以在你需要的地方连接这个密钥生成器:

    @Cacheable(value = "nameofmycachearea", keyGenerator="fooGenerator")
    

    【讨论】:

    • 你好!你能帮我吗?很抱歉写到这里。我在构建自定义 keyGenerator 时遇到问题。如何在没有由键“someKey”返回的参数的情况下获取方法 getAllEntities()? (我的个人资料中有最后一个问题)
    猜你喜欢
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多