Spring 4 @Cacheable,除非带有属性表达式的表达式

时间:2018-05-25 16:57:59

标签: java spring spring-el

是否可以在@Cacheable注释的除外表达式中使用spring属性占位符?我有一个我想要缓存的服务方法,除非返回的结果小于@PropertySource(“classpath:application.properties”)中指定的属性minCacheCalc的值。

这是我要缓存的服务类方法:

@Service
class CalculationService {
    // @Cacheable(cacheNames="calculations", unless="#result < 10") // works fine hardcoded
    @Cacheable(cacheNames="calculations", unless="#result < ${minCacheCalc}")
    public Integer calculate(Integer i) {
        System.out.println("calculate(" + i + ")");
        return i * i - i;
    }

}

调用此方法会抛出错误:

SpelParseException: EL1041E: After parsing a valid expression, there is still more data in the expression: 'lcurly({)'

我尝试了很多语法变体,但我似乎无法找到它。

有没有办法在@ Cacheable的unless参数中引用属性?

2 个答案:

答案 0 :(得分:0)

我认为它看起来应该更像:

#{result lt minCacheCalc}

我使用this as a reference

答案 1 :(得分:0)

您可以这样实现:

  • 在类的字段中插入属性值
private int minCacheCalc;

public CalculationService(@Value("${minCacheCalc}") int minCacheCalc) {
    this.minCacheCalc = minCacheCalc;
}

  • 添加属性的吸气剂
public int getMinCacheCalc() {
    return this.minCacheCalc;
}
  • 在除非SpEL中使用实例字段
@Cacheable(cacheNames="calculations", unless="#result < #root.target.minCacheCalc")