如何以DTO字段作为@CachePut的缓存键(方法参数无该DTO)
Spring缓存@CachePut以返回对象字段为键的解决方案
要实现以返回的Product对象的name字段作为缓存键,直接利用Spring缓存的SpEL表达式#result即可——它代表当前方法的返回值,无需额外传入Product参数。
修改后的代码示例
调整getProductFromExternalApi方法的@CachePut注解配置:
@CachePut(value = "products", key = "#result.name") public Product getProductFromExternalApi(String productName){ // 构建外部API请求的逻辑代码 Product product = externalApiClient.fetchProduct("100g " + productName); productRepository.save(product); return product; }
逻辑说明
#result是Spring缓存SpEL的内置变量,指向当前方法执行后的返回对象(这里就是从外部API获取到的Product实例)。- 通过
#result.name直接取返回对象的name字段作为缓存键,正好匹配你需要的banana而非100g banana。 - 结合Controller层的
@Cacheable配置,当首次调用端点且缓存、数据库都无数据时,调用外部API后会自动以productName(即banana)为键将结果存入缓存,后续请求直接命中缓存,避免重复调用外部API。
无需处理root.target或做字符串截取,通过注解的SpEL表达式就能直接实现需求。
内容的提问来源于stack exchange,提问作者MichalWds
相关产品推荐
相关产品推荐

