6

我正在尝试使用 Ehcache 和 Spring 3.1 内置的缓存注释(@Cacheable、@CacheEvict 和 @CachePut)在我的应用程序中实现缓存。

我创建了一个缓存,如下所示:

@Cacheable(value = "userCache", key = "#user.id")
public List<User> getAllUsers() {
...
}

我正在尝试使用 @CachePut 注释使用新值更新此缓存,如下所示:

@CachePut(value = "userCache", key = "#user.id")
public void addUser(User user) {
...
}

但是,新的“用户”并未添加到缓存中。这是因为 void 返回类型吗?

4

2 回答 2

8

是的,这是因为 void 返回类型。@CachePut 注释将方法的结果放入缓存中。在您的情况下,没有结果,因此没有任何内容放入缓存。

更改方法签名以返回用户:

public User addUser(User user) { 
   ...
}
于 2013-07-31T05:03:16.457 回答
2

这不起作用,因为您使用的是相同的缓存值“userCache”,但 getAllUsers 方法的返回类型是 List,addUser 的返回类型是 User。这将导致存储在缓存中的数据不一致。

( List + User ) : 这种类型的数据将在缓存中形成。

稍后当您调用方法 getAllUsers 时,代码将是

列出用户列表 = getAllUsers();

但是在这种情况下,将从缓存中获取数据并抛出“Class cast Exception”。

因为,(列表 + 用户)不能转换为列表。

有什么解决办法吗?我坚持这一点,不知道如何继续。在这里使用自定义注释会起作用吗?

于 2014-07-31T12:12:50.400 回答