Spring Boot @CachePut值为null

时间:2016-08-01 14:55:04

标签: java spring caching spring-boot

我有一个存储简单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.idjm.getid()#a0.getId()。仍然,每次我从com.google.common.base.Preconditions.checkNotNull()得到和异常(或只是一个简单的空插入)。我在那里放了一个断点,我可以看到键是我所期望的(一个guid,string),但是值为null。

2 个答案:

答案 0 :(得分:1)

根据http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/CachePut.html

的春季文档

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 表达式,该表达式的值为truefalse。如果true,则该方法被缓存-如果不缓存,则其行为就好像该方法未被缓存

@CachePut(value = CacheNames.CACHE_JOB, key = "jm.id", unless = "#result == null")
@Transactional
@Override
public void insert(JobModel jm) {
    return jm;
}