【问题标题】:How do I tell Spring Cache to cache the exceptions in @Cacheable annotation?如何告诉 Spring Cache 缓存 @Cacheable 注解中的异常?
【发布时间】:2016-10-04 11:13:22
【问题描述】:

我需要 3 个独立的缓存:

  • 响应一些数据
  • 异常

我已经定义了两个缓存

@Caching(cacheable = {
    @Cacheable(value = "SomeCache", key = "#a1", unless = "#result == null"),
    @Cacheable(value = "SomeNullCache", key = "#a1", unless = "#result != null")})

所以,我必须实现最后一种情况。

JSR-107 提供了带有 exceptionCacheName 属性的 @CacheResult 注释,但是我如何使用 Spring Cache 来做到这一点?我不想将 JSR-107 和 Spring Cache 结合起来。

【问题讨论】:

    标签: java spring caching spring-cache jcache


    【解决方案1】:

    缓存抽象不支持缓存注解方法抛出的异常。你的设置对我来说看起来很奇怪。为什么要对空值和非空值使用两个不同的区域?

    如果您想要这样的设置,请使用标准注释。

    我不想将 JSR-107 和 Spring Cache 结合起来。

    id 生成不同(符合规范并保持向后兼容性),我不推荐这种用法。至少不在同一个地区。

    【讨论】:

    • 我必须区分空值、非空值、异常值并将它们放入差异缓存中,因为它们具有不同的配置(生命周期等)。如果缓存抽象不支持缓存异常抛出,如何为空值和非空值定义单独的缓存? @CacheResult 注解没有 conditionunless 属性。
    • 只允许使用一个 JSR-107 注释,因此它们不支持该用例。空值和非空值之间的生存时间差异是心理上的(对不起。再次。)。
    • 我理解需要以不同方式处理空/错误结果 - 您可能希望更长时间地缓存真实结果,但更快重试。我建议使用这些信息将各种结果(ok / null / exception)包装到另一个对象中;然后你可以有单独的方法,你可以根据结果的类型“运行”。但这不是可读的代码。在这种情况下,也许您可​​以避免使用注解,而直接使用缓存 API。
    猜你喜欢
    • 2012-08-20
    • 2021-08-22
    • 2019-12-09
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多