【问题标题】:Spring 3.1 cache - how to use the returned value in the SpELSpring 3.1 缓存 - 如何在 SpEL 中使用返回值
【发布时间】:2012-05-27 13:21:20
【问题描述】:

我正在尝试驱逐 Spring 管理的缓存(Spring 3.1 抽象)中的条目。

我需要参考注解中“key”属性的SpEL中方法的返回值:

    /* (How to refer to the 'T' returned value in the "KEY_ID"?) */
@Caching(evict = { @CacheEvict(value = CACHE_BY_ID, key = KEY_ID) })
public T delete(AppID appID, UserID userID) throws UserNotFoundException {
    return inner.delete(appID, userID);
}

有什么办法吗?

【问题讨论】:

标签: java spring caching spring-el


【解决方案1】:

似乎没有任何方法可以引用返回的对象:

http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html#cache-spel-context

但是你为什么需要这样做呢?您可以参考@CacheEvict "key" 值中的参数,例如:

@CacheEvict(value = CACHE_BY_ID, key = "#userID")
public T delete(AppID appID, UserID userID) throws UserNotFoundException {
...
}

更多示例代码响应以下关于必须使用用户对象的多个属性从多个缓存中逐出的响应:

@Caching(evict = {
    @CacheEvict(value = CACHE_BY_ID, key = "#user.userID"),
    @CacheEvict(value = CACHE_BY_LOGIN_NAME, key = "#user.loginName")
    // etc.
})
public T delete(AppID appID, User user) throws UserNotFoundException {
...
}

【讨论】:

  • “delete”返回的T类对象是这样的对象:class User { UserID userID;登录名登录名;电子邮件地址电子邮件地址; ... }。我有不止一个缓存 - 一个按用户 ID,另一个按 loginName,另一个按电子邮件地址。当我通过用户 ID 删除一个条目时,我希望其他两个缓存中的条目也过期......并且这些键包含在返回值中,所以如果我能这样做会很棒:@CacheEvict(key= "#returnValue.loginName"...), @CacheEvict(key="#returnValue.emailAddress"...)
  • 如果您将 User 对象作为参数而不是 UserID 传递,您可以这样做,因为您可以在 SpEL 中引用不同的用户属性。如果您需要执行多个不同配置的 \@CacheEvict's:static.springsource.org/spring/docs/3.1.x/…,则必须将其与 \@Caching 注释相结合
  • 根据您的评论,我使用更多示例代码编辑了我的答案,这些代码可能更适合您的情况。
  • 传递整个用户对于这种情况并不是一个好的解决方案 - 但我能从旧版本中想到唯一的解决方案。不过我似乎记得它会在较新的版本中得到支持,我在 Spring 中看到了一个相关的 JIRA...
【解决方案2】:

尝试在你的 SpEL 中使用#result

【讨论】:

    猜你喜欢
    • 2015-05-02
    • 2011-11-11
    • 2012-06-05
    • 2014-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多