使用Spring Caching Annotations时,将常量自定义前缀添加到Cache键

时间:2018-06-12 08:11:13

标签: spring spring-boot spring-el

我在服务中使用基于注释的Spring Cache抽象。

我想在添加到缓存时为密钥添加自定义前缀。

我创建了一个常量并尝试将它们添加到以下方法中。

Latin1_General_CI_AS_KS_WS

但是,我得到如下的堆栈跟踪。

private static final String CACHE_KEY_PREFIX="user";

    @Cacheable(value = "users", key = "{ CACHE_KEY_PREFIX,#userId }")
    @GetMapping("/{userId}")
    public User getUser(@PathVariable String userId) {
        LOG.info("Getting user with ID {}.", userId);
        return userRepository.findOne(Long.valueOf(userId));
    }


    @CacheEvict(value = "users",key="{ CACHE_KEY_PREFIX,#userId }" )
    @DeleteMapping
    public void deleteUserByID(@PathVariable Long userId) {
        LOG.info("deleting person with id {}", userId);
        userRepository.delete(userId);
    }   

由于我有多种方法,所以我不想在每个方法注释中对自定义前缀进行硬编码。

有没有办法添加自定义前缀并避免我看到的异常。

1 个答案:

答案 0 :(得分:1)

要在注释中使用常量,可以将其包含为固定字符串,如下所示:

@Cacheable(value = "users", key = "{'" + CACHE_KEY_PREFIX + "', #userId}")
@GetMapping("/{userId}")
public User getUser(@PathVariable String userId) {
    LOG.info("Getting user with ID {}.", userId);
    return userRepository.findOne(Long.valueOf(userId));
}

在这种情况下,编译器会将属性key的值解析为{'user', #userId}