如何在 Spring Boot 应用程序的同一方法上使用 @CachePut 和 @CacheEvict?

How to use @CachePut and @CacheEvict on the same method in a Spring Boot application?

我正在开发一个 Spring 引导应用程序,我有一个场景可以将 @CachePut@CacheEvict 放在同一个方法上。

我用下面给出的代码尝试了这个场景:

@CachePut(value="myValue",key="#entity.getId(),#entity.getOrgId()", 
          cacheManager="no-expire-caching")
@CacheEvict(value="myValue", key="#entity.getId(),#entity.getOrgId()",
          cacheManager="no-expire-caching", condition="#entity.isDeleted() == true")
public MyEntity save(boolean flag, MyEntity entity){
    if (flag==true){
        entity.setIsDeleted(true);
        return myRepo.save(entity);
    }
    return myRepo.save(entity);
}

但这似乎没有按预期工作。

目标:

是否可以在 Spring 中实现?我应该如何修改我的代码?

您可以在 Spring 中使用 @Caching 注释在同一方法上实现多个不同缓存注释的使用。

注意:这适用于使用不同的缓存。

根据Spring Cache Abstraction Docs:

When multiple annotations such as @CacheEvict or @CachePut is needed to be specified on the same method for different caches.

Then to achieve this, the workaround is to use @Caching. @Caching allows multiple nested @Cacheable, @CachePut and @CacheEvict to be used on the same method.

试试这个(如果有效的话):

@Caching(put={@CachePut(value="myValue",key="#entity.getId(),#entity.getOrgId()", 
          cacheManager="no-expire-caching")}, evict = {@CacheEvict(value="myValue", key="#entity.getId(),#entity.getOrgId()",
          cacheManager="no-expire-caching", condition="#entity.isDeleted() == true")})
public MyEntity save(boolean flag, MyEntity entity){
    if (flag==true){
        entity.setIsDeleted(true);
        return myRepo.save(entity);
    }
    return myRepo.save(entity);
}

@Caching Java Docs供参考