[英]Spring Boot @CachePut value is null
我有一个存储简单POJO的地图,键是POJO的id字段。 从Spring的@CachePut批注中,我期望这样的事情:
JobModel jm = new JobModel();
cachemap.put(jm.getId(), jm);
尽管如此,它每次仍将空值插入高速缓存。 如果在配置缓存时不允许使用null值,则会出现异常,提示正在插入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类,则在Dao的声明中声明Annotations(实现接口的类,而不是在接口本身中)
@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()
获得异常(或者只是简单的null插入)。 我在此处放置了一个断点,可以看到该键是我期望的键(GUID,字符串),但该值为空。
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保存到数据库的方法也可能是一个好地方。
此外,您可以使用以下条件, 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.