0

我正在尝试使用spring的@Cacheable进行缓存。我也在使用spring 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 可能不公开,但我想在我的 User 模型中将“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中缓存用户下的所有“用户”,但以用户“id”作为键进行缓存。然后,我还想在保存用户时基于相同的 id 驱逐。

4

1 回答 1

0

仅供参考,异常与代码不匹配(缓存的名称不同)。

keyon 属性findById没用。默认情况下,缓存抽象将使用方法参数来计算密钥。由于您只有一个论点,因此它将使用该论点。您可以按如下方式重写该方法并获得完全相同的结果:

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

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

于 2016-08-25T08:42:33.903 回答