2017-04-24 33 views
7

Mam aplikację rozruchu sprężyny, które mają kontroler MVC wiosny. Próbuję wersji mojej api odpoczynku za pomocą nagłówka Accept.Spring MVC controller versioning

Poniżej jak mój kontroler wygląda

RestController 
@RequestMapping(value = "/private/") 
public class AppleController { 

    private final AppleService appleService; 

    public AppleController(AppleService appleService) { 
    this.appleService = appleService; 
    } 

    @GetMapping(value = "apples/{id}", produces = "application/json; v=1.0", 
     headers = "Accept=application/json; v=1.0") 
    public ResponseEntity getByappleId(@PathVariable("id") Long appleId) { 
    System.out.println("version1"); 

    GetByappleIdResponse response = appleService.findByappleId(appleId); 

    return new ResponseEntity<>(response, HttpStatus.OK); 
    } 



    @GetMapping(value = "apples/{id}", produces = "application/json; v=2.0", 
     headers = "Accept=application/json; v=2.0") 
    public ResponseEntity getByappleId2(@PathVariable("id") Long appleId) { 
    System.out.println("version2"); 
    GetByappleIdResponse response = appleService.findByappleId2(appleId); 
    return new ResponseEntity<>(response, HttpStatus.OK); 
    } 

niezależnie od wersji, że jestem przechodzącej w nagłówku Accept podczas wywoływania funkcji API zawsze metoda „getByappleId” nazywa, stąd tylko wersja 1 odpowiedź jest zwracany .

Czy coś jest nie tak z moim kontrolerem?

+0

Wygląda Accept-params w Zebrane nagłówek nie jest używany przez wiosnę . –

+0

Możliwy duplikat http://stackoverflow.com/questions/34425316/spring-requestmapping-header-with-equals – heenenee

+0

off topic nie używaj System.out użytkowania rejestratora w miarę możliwości –

Odpowiedz

2

Jak opisano w tej odpowiedzi: https://stackoverflow.com/a/34427044/258813 (a wspomniane w komentarzach) Wiosna nie obsługuje routing przy użyciu nagłówków, takich jak to.

Jeśli chcesz obsługiwać routing za pośrednictwem nagłówka wersji, polecam niestandardowy warunek routingu i adnotację - na pewno, jeśli budujesz duży interfejs API, spowoduje to mniej kodu i bardziej eleganckiego rozwiązania.

Użytkownik zdefiniowałby pewną adnotację, taką jak @ApiVersion(1), którą można dodać do dowolnej metody, która jest również mapowaniem żądań, a następnie dodać niestandardowy warunek trasowania i zachowuje się poprawnie.

opisałem stosując warunki zwyczaj routingu i adnotacji (na podstawie subdomen - ale to może być łatwo włączone do zamiast sprawdzić nagłówki) tutaj: http://automateddeveloper.blogspot.co.uk/2014/12/spring-mvc-custom-routing-conditions.html

+0

Dzięki @rhinds na odpowiedź –

+0

To byłby lepszy dołączyć kilka przykładów kodu – LoganMzz

4

Istnieje wiele opcji do wdrożenia wersjonowanie REST API:

  • sugerowanej w podejściu komentarzy do ręcznego trasowania żądania;
  • dokonywania wersji jako część swojej Accept wartości nagłówka, fe:

    (headers = "Accept=application/vnd.name.v1+json")

    (headers = "Accept=application/vnd.name.v2+json")

  • dokonywania wersji jako część swojego odwzorowania:

    @GetMapping("apples/v1/{id})"

    @GetMapping("apples/v2/{id})

Musisz zdecydować, którą drogą wybrać. Przydatne linki:

Powiązane problemy