2016-08-01 17 views
0

Ich habe eine Karte, die einfache POJOs speichert, der Schlüssel ist das ID-Feld des POJO. Von Spring @CachePut Anmerkung, erwartete ich etwas wie folgt aus:Spring Boot @CachePut Wert ist Null

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

Dennoch ist es NULL-Werte in den Cache fügt jedes Mal. Wenn ich beim Konfigurieren des Cache null Werte verbiete, bekomme ich eine Ausnahme, die besagt, dass null eingefügt wird.

Code:

@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; 
    } 

Und die Dao-Klasse, eine Schnittstelle implementieren, werden die Anmerkungen in der (die Klasse Dao erklärt, die die Schnittstelle implementiert, nicht in der Schnittstelle selbst)

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

ich versuchte jm.id, jm.getid() , #a0.getId(). Dennoch, jedes Mal, wenn ich bekomme und Ausnahme von com.google.common.base.Preconditions.checkNotNull() (oder nur eine einfache Null einfügen). Ich habe einen Haltepunkt dort platziert und ich kann sehen, dass der Schlüssel ist, was ich erwartet habe (eine Guid, String), aber der Wert ist null.

Antwort

1

Per Feder docs bei 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.

Ihre insert-Methode den Wert, den Sie gecached zurückgeben muss.

Könnte etwas so einfaches wie sein:

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

obwohl dies nicht wie die beste Art und Weise fühlt sich das Zusammenspiel zu entwerfen. Vielleicht möchten Sie die Annotation auf eine beliebige Methode verschieben, die das JobModel erstellt, das an die Insert-Methode übergeben wurde, oder wenn das JobModel aus einer Datenbank gelesen wird, kann die Methode, die das JobModel in der Datenbank speichert, ebenfalls ein guter Platz sein.

+0

Der RestController ruft das Dao-Objekt auf und ich denke nicht, dass ich dort einen CachePut verschieben sollte (es gibt auch nichts zurück) – appl3r