我正在尝试使用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逐出。
答案 0 :(得分:0)
仅供参考,例外与代码不匹配(缓存名称不同)。
key
上的findById
属性无用。缓存抽象默认使用方法参数来计算密钥。由于你只有一个参数,它将使用所述参数。您可以按如下方式重写方法并获得完全相同的结果:
@Cacheable(value="byId")
User findById(String id);
我无法对另一个问题发表评论。如果缓存抽象抱怨某些东西是私有的,那么它必须在缓存逐出,而不是在这个方法上。因此,发布与描述一致的异常将有所帮助。