我有一个存储简单POJO的地图,关键是POJO的id字段。 从Spring的@CachePut注释中,我期待这样的事情:
JobModel jm = new JobModel();
cachemap.put(jm.getId(), jm);
但是,它每次都会向缓存插入空值。如果我在配置Cache时不允许使用空值,我会得到例外,说明正在插入null。
代码:
@SpringBootApplication
@EnableScheduling
@EnableAutoConfiguration
@EnableCaching
public class Application {
public static void main(String[] args) {
applicationContext = SpringApplication.run(Application.class, args);
}
...
private GuavaCache jobCache() {
return new GuavaCache(CacheNames.CACHE_JOB, CacheBuilder.newBuilder()
.maximumSize(999999)
.build(),
false);// or true, still null values
}
@Bean(name = "cacheManager")
public CacheManager cacheManager() {
SimpleCacheManager simpleCacheManager = new SimpleCacheManager();
simpleCacheManager.setCaches(Arrays.asList(
jobCache(),....
));
return simpleCacheManager;
}
Dao类,实现一个接口,Annotations在Dao中实现(实现接口的类,而不是接口本身)
@CachePut(value = CacheNames.CACHE_JOB,key = "jm.id")
@Transactional
@Override
public void insert(JobModel jm) {...}
我尝试了jm.id
,jm.getid()
,#a0.getId()
。仍然,每次我从com.google.common.base.Preconditions.checkNotNull()
得到和异常(或只是一个简单的空插入)。我在那里放了一个断点,我可以看到键是我所期望的(一个guid,string),但是值为null。
答案 0 :(得分:1)
it always causes the method to be invoked and its result to be stored in the associated cache.
您的insert方法需要返回您想要缓存的值。
可能是一件简单的事情:
@CachePut(value = CacheNames.CACHE_JOB,key = "jm.id")
@Transactional
@Override
public JobModel insert(JobModel jm) {
return jm;
}
尽管这并不是设计互动的最佳方式。您可能希望将注释移动到构造传递给insert方法的JobModel的任何方法,或者如果正在从数据库中读取JobModel,那么将JobModel保存到数据库的方法也可能是个好地方。 / p>
答案 1 :(得分:0)
此外,您可以在缓存注释中使用unless
条件属性,如下所示。此参数采用一个 SpEL 表达式,该表达式的值为true
或false
。如果true
,则该方法被缓存-如果不缓存,则其行为就好像该方法未被缓存。
@CachePut(value = CacheNames.CACHE_JOB, key = "jm.id", unless = "#result == null")
@Transactional
@Override
public void insert(JobModel jm) {
return jm;
}