Spring可缓存错误,尝试通过ID密钥缓存用户并以相同的方式驱逐它

时间:2016-08-24 16:23:00

标签: spring-cache spring-mongodb

我正在尝试使用spring的@Cacheable进行缓存。我也使用春天mongodb。我一直收到以下错误:

java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) CacheableOperation[public abstract test.models.User test.repositories.UserRepository.findById(java.lang.String)] caches=[userById] | key='#id' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='' | unless=''

这是我正在使用的代码。似乎我是否使用"#id"或" id"它似乎不起作用。要么我得到IllegalArgumentException,要么抱怨id可能不公开,但我想保持" id"在我的用户模型中为私有。

public interface UserRepository extends MongoRepository<User, String> {

    @Override
    @CacheEvict(value="byId", key="#entity.id")
    <S extends User> S save(S entity);

    @Cacheable(value="byId", key="#id")
    User findById(String id);

    public User findByUsername(String username);

}

有人可以指出我做错了什么吗?从本质上讲,我想在redis中缓存所有&#34;用户&#34;在用户下面,但用User&#34; id&#34;作为关键。然后,我还希望在保存用户时根据相同的ID逐出。

1 个答案:

答案 0 :(得分:0)

仅供参考,例外与代码不匹配(缓存名称不同)。

key上的findById属性无用。缓存抽象默认使用方法参数来计算密钥。由于你只有一个参数,它将使用所述参数。您可以按如下方式重写方法并获得完全相同的结果:

@Cacheable(value="byId")
User findById(String id);

我无法对另一个问题发表评论。如果缓存抽象抱怨某些东西是私有的,那么它必须在缓存逐出,而不是在这个方法上。因此,发布与描述一致的异常将有所帮助。