2013-09-03 12 views
7

Planuję wspierać ETag dla mojej aplikacji RESTfull Spring. Większość zasobów, które wystawiam, jest wersjonowana w DB.Obsługa ETag na wiosnę dla wersjonowanego podmiotu

Jestem świadomy ShallowEtagHeaderFilter, który nie jest dokładnie tym, czego potrzebuję, ponieważ to tylko oszczędza przepustowość.

Czy istnieje gotowe rozwiązanie produkcyjne dla Spring MVC, które łączy nagłówek ETag z odsłoniętą wersją encji?

+4

Znalazłem dobry artykuł http://www.infoq.com/articles/etags, który jest podobny do tego, czego potrzebuję, ale nadal potrzebuje trochę pracy do wykonania. – mavarazy

+1

Witaj mavarazy widziałeś https://github.com/patrickvankann/spring-conditional-response? –

+0

Nie, nie, dziękuję za link – mavarazy

Odpowiedz

6

Spring-data-rest obsługuje to rozwiązanie gotowe do użycia, patrz the conditional request part of the reference documentation.

Możesz także użyć Spring Framework 4.2.0+, który obsługuje żądania warunkowe dla typów ResponseEntity zwróconych przez metody Controller - see reference documentation.

Coś jak:

@RequestMapping("/book/{id}") 
public ResponseEntity<Book> showBook(@PathVariable Long id) { 

    Book book = findBook(id); 
    String version = book.getVersion(); 

    return ResponseEntity 
       .ok() 
       .cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS)) 
       .eTag(version) // lastModified is also available 
       .body(book); 
} 
0

Można użyć połączenia ServletWebRequest.checkNotModified aby sprawdzić niestandardowych Etags który w danym przypadku byłby numer wersji. Ponownie, działałoby to tylko wtedy, gdy zmiany w twoich treściach gwarantują zmianę numeru wersji.

Więcej szczegółów here.