You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以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;
}

逻辑说明

  1. #result是Spring缓存SpEL的内置变量,指向当前方法执行后的返回对象(这里就是从外部API获取到的Product实例)。
  2. 通过#result.name直接取返回对象的name字段作为缓存键,正好匹配你需要的banana而非100g banana。
  3. 结合Controller层的@Cacheable配置,当首次调用端点且缓存、数据库都无数据时,调用外部API后会自动以productName(即banana)为键将结果存入缓存,后续请求直接命中缓存,避免重复调用外部API。

无需处理root.target或做字符串截取,通过注解的SpEL表达式就能直接实现需求。

内容的提问来源于stack exchange,提问作者MichalWds

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:25:19