Spring Boot @Cacheable抛出错误缓存操作返回的键为Null

s1ag04yj  于 2023-03-18  发布在  Spring
关注(0)|答案(3)|浏览(444)

更新日期:

已尝试key="#p0",但无法正常工作
尝试用 Spring Boot 来实现Redis缓存我的产品,但我面临的问题,感谢任何帮助

java.lang.参数非法异常:缓存操作返回空键(可能您在没有调试信息的类上使用了命名参数?)
主计长

@CrossOrigin(origins = "*", maxAge = 3600)
@RestController
@RequestMapping("/api/products")
public class ProductController {
    
    @Autowired
    ProductService productService;
    
    @GetMapping("/")
    public ResponseEntity<?> getAll() {

        List<Product> products = productService.findAll();
     
        return ResponseEntity.ok(products);
    }

}

服务

@Cacheable(value = "product", key = "#productId")
public List<Product> findAll() {
        return productRepository.findAll();
}

@EnableCaching注解也已放在主类中

w6mmgewl

w6mmgewl1#

key的值应该与用@Cacheable注解的方法的一个参数findAll的名称匹配。由于findAll没有参数,因此没有任何内容可用作键。
https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/cache.html#cache-annotations-cacheable-key
在内存中“缓存”所有乘积的一种简单方法是将第一次调用productRepository.findAll()的结果存储在一个示例变量中。

class ProductService {
  
  private List<Product> productCache;

  public List<Product> findAll() {
    if (productCache == null) {
      productCache = productRepository.findAll();
    }
    return productCache;
  }
}
hjzp0vay

hjzp0vay2#

要使用存储库中的List<Product>填充product缓存,可以通过编程方式调用CacheManager

@Autowired CacheManager cacheManager;

public List<Product> findAll() {
    List<Product> products = productRepository.findAll();
    for (Product product : products) {
        cacheManager.getCache("product").put(product.getProductId(), product);
    }
    return products;
}
j13ufse2

j13ufse23#

key中的值必须是使用了cacheable注解的方法的参数之一。

您可以做的一件事是在调用findAll方法时传递productId的值。
这个错误仅仅意味着你使用了一个null值作为你的键,Redis不允许这样做

相关问题