Java 从带有@Cacheable注释的方法中清除缓存

Java 从带有@Cacheable注释的方法中清除缓存,java,spring,caching,spring-cache,Java,Spring,Caching,Spring Cache,我有一个用@Cacheable注释的方法。如果在方法内部捕获了异常,我希望清除缓存。但是,缓存似乎是在清除缓存的行之后执行的方面中加载的。因此,当在方法中捕获异常时,即使清除了缓存,空字符串结果仍保留在缓存中 我应该从哪里清除缓存 @Cacheable("myCache") public String myMethod() { String result=""; try { result = doSomething();

我有一个用@Cacheable注释的方法。如果在方法内部捕获了异常,我希望清除缓存。但是,缓存似乎是在清除缓存的行之后执行的方面中加载的。因此,当在方法中捕获异常时,即使清除了缓存,空字符串结果仍保留在缓存中

我应该从哪里清除缓存

@Cacheable("myCache") 
public String myMethod() {
    String result="";
    try {
        result = doSomething();
    } catch (Exception e) {
        cacheManager.getCache("myCache").clear();
    }
    return token;
}

好的-注释上有一个属性可以使用。以下示例来自()

除非:条件缓存,应用于方法的返回值。项目 将被缓存,除非满足“除非”中提到的条件。笔记 该条件适用于方法的返回值。#结果引用 方法返回值


@Cacheable(value=“products”,key=“#product.name”,condition=“#product.price好的-注释上有一个属性可以使用。以下示例来自()

除非:条件缓存,应用于method.Item的返回值 将被缓存,除非满足“除非”中提到的条件。注意 该条件适用于方法的返回值。#结果引用 方法返回值


@Cacheable(value=“products”,key=“#product.name”,condition=“#product.price”你考虑过了吗?@MrR实际上我正在使用它。但是我应该从哪里调用带有@cacheexecute注释的方法呢?没有看Spring代码,我猜Spring会用一些代码包装对myMethod的调用,这些代码会将返回值放入缓存中(由于注释的原因)。如果捕获到异常并仍然返回某些内容,它无法知道缓存不应更新-因此,您可能应该传播异常(至少再向外传播一层)[我要再次总结,在异常情况下不会发生缓存-它必须缓存什么值?如果您希望清除myCache,我也会执行您需要的任何操作]。好的,但我不希望以其他方式传播异常-解释了@CacheExit的其他场景(例如,Save意味着下一个Get应该重新计算/转到服务器/任何东西)您考虑过吗?@MrR实际上我正在使用它。但是我应该从哪里调用带有@cacheexecute注释的方法?没有查看Spring代码,我猜Spring会用一些代码包装对myMethod的调用,这些代码会将返回值放入缓存中(由于注释的原因)。如果捕获到异常并仍然返回某些内容,它无法知道缓存不应更新-因此,您可能应该传播异常(至少再向外传播一层)[我要再次总结,在异常情况下不会发生缓存-它必须缓存什么值?如果您希望清除myCache,我也会执行您需要的任何操作]。好的,但我不希望以其他方式传播异常-解释了@CacheExit的其他场景(例如,“保存”意味着下一个Get应该重新评估/转到服务器/任何东西)因此,您不必添加异常-它将实现与除非相同的功能,但不会强制调用方更改/处理异常。因此,您不必添加异常-它将实现与除非相同的功能,但不会强制调用方更改/处理异常。
@Cacheable(value="products", key="#product.name", condition="#product.price<500", unless="#result.outofstock")
public Product findProduct(Product product){
..
return aproduct;
}