2016-08-01 167 views
0

我有一個存儲簡單POJO的地圖,關鍵是POJO的id字段。 從Spring的@CachePut註解,我希望這樣的事情:Spring Boot @CachePut值爲空

JobModel jm = new JobModel(); 
cachemap.put(jm.getId(), jm); 

儘管如此,它插入空值每一次高速緩存。如果我在配置緩存時不允許空值,我會得到一個例外,表示正在插入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的(實現接口,而不是在類中聲明接口本身)

@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),但是該值爲空。

回答

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.

你插入方法需要返回你想要緩存的值。

可能是簡單的東西如:

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

雖然這感覺並不像設計的交互的最佳方式。您可能希望將註釋移動到構建傳遞給insert方法的JobModel的任何方法,或者如果從數據庫讀取JobModel,將JobModel保存到數據庫的方法也可能是一個好的選擇。

+0

RestController調用dao對象,我不認爲我應該將一個CachePut移動到那裏(同樣,它也不會返回任何東西) – appl3r