spring 将DTO字段用作@CachePut的键,方法参数中未提及

blpfk2vs  于 2023-01-25  发布在  Spring
关注(0)|答案(1)|浏览(115)

我想使用缓存来处理大量的外部API调用。
逻辑是这样的:
1.使用参数banana调用我的自定义终结点
1.正在检查缓存
1.如果没有缓存,请检查数据库
1.如果不在数据库中,则调用外部API
1.保存到数据库,保存到缓存
1.返回
我做了一些草案实现,但当我调用外部API时,我不仅需要提供banana,还需要提供100g banana,这意味着,如果我把注解@CachePut作为键指向参数,那么在缓存中我会保存字符串100g banana而不是banana。通过提供key作为response对象的字段值是否可以节省缓存?(只是香蕉)假设外部json有效负载使用字段进入ProductDTO

  • 姓名
  • 体重
@Cacheable(value = "products", key = "#productName", unless = "#result == null")
    @GetMapping("/prod/{productName}")
    public Product getProductCache(@PathVariable String productName) {
        log.info("Getting product with name {}.", productName);

        Product product = productRepository.getByName(productName);
        log.info("Product in database is:{}", product);
        if (product == null) {
            product = productService.getProductFromExternalApi(productName);
        }

        return product;
    }
@CachePut(value = "products", key = "#I want product.getName without passing Product as a parameter")
    public Product getProductFromExternalApi(String productName){

        SOME CODE TO BUILD A REQUEST

            productRepository.save(product);

            return product;
    }

顺便说一句,我没有得到www.example.com,它指向Controller类而不是Product。我可以做一个正则表达式或子字符串,100g香蕉到香蕉,但是的,我想知道是否可以直接从注解root.target which points to the Controller class rather than Product. I can ofc make a regex or substring that 100g banana to banana but yea, I wonder if it's possible just directly from the annotation

2q5ifsrm

2q5ifsrm1#

你试过用这个吗?

@CachePut(value = "products", key = "#p1")

或者

@CachePut(value = "products", key = "#product.name")

相关问题