Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正确的键注释,用于缓存列表中的项而不是整个列表中的项_Java_Spring_Caching_Ehcache - Fatal编程技术网

Java 正确的键注释,用于缓存列表中的项而不是整个列表中的项

Java 正确的键注释,用于缓存列表中的项而不是整个列表中的项,java,spring,caching,ehcache,Java,Spring,Caching,Ehcache,下面代码的问题是缓存基于列表,而不是列表中的每项 因此,如果我向这个方法发送一个包含两个项目的列表,它们都会被缓存,而不是在删除其中一个项目的情况下再次调用该方法,它应该从缓存中读取,但它会看到列表已更改,因此会运行该方法,而不是使用缓存 正确的注释是什么,以便它缓存在单个项目上而不是整个列表上 @Override @Cacheable(value = "cacheName") public Properties retrieveProperties(List<String> tes

下面代码的问题是缓存基于列表,而不是列表中的每项

因此,如果我向这个方法发送一个包含两个项目的列表,它们都会被缓存,而不是在删除其中一个项目的情况下再次调用该方法,它应该从缓存中读取,但它会看到列表已更改,因此会运行该方法,而不是使用缓存

正确的注释是什么,以便它缓存在单个项目上而不是整个列表上

@Override
@Cacheable(value = "cacheName")
public Properties retrieveProperties(List<String> testList) {
@覆盖
@可缓存(value=“cacheName”)
公共属性检索属性(列表测试列表){

我认为这里的问题是您没有在@Cacheable annotation中声明密钥:

@Cacheable(value = "cacheName", key = "#root.method.name")
根据文档,如果一个键没有特殊化,它将使用所有的方法参数来创建该键,因此,如果列表发生更改,它可能会单独存储该键

如果这不是问题所在,那么可能是您在ehcache.xml上的配置中出现了问题,可能是“timeToLive”太短,导致缓存重新加载


希望这会有所帮助。

使用Spring缓存注释无法实现您想要的功能

另外,操作的语义是什么

  • 属性
    内容由
    列表
    内容驱动
  • 还是别的什么
像Spring提供的一般抽象如何能够涵盖这些特定用例


因此,简而言之,您必须为这样一个特定的用例编写自己的缓存逻辑。

为什么即使参数已更改,您也希望返回相同的结果?我们以前尝试过上述方法,但get是一个方法而不是成员。testList.get()在该注释中不起作用。