2016-07-27 33 views
6

Próbuję zrozumieć dokładne zachowanie kontrolerów spoczynkowych danych sprężyn.Kontrolery przerwania danych sprężystych: zachowanie i użycie @BasePathAwareController, @RepositoryRestController, @Controller i @RestController

Zrobiłem prostą implementację do testowania 4 rodzaje kontrolerów adnotacjami: @BasePathAwareController, @RepositoryRestController, @RestController, @Controller

Sterownik posiada odwzorowanie dla „autor” podmiotem w repozytorium.

Jest to kontroler:

@BasePathAwareController 
//@RepositoryRestController 
//@RestController 
//@Controller 
public class MyController { 

    @RequestMapping(value="authors/mycontroller/test") 
    public void handleRequest(){ 
     System.out.println("handleRequest of class MyController"); 
    } 

    @RequestMapping(value="/authors/mycontroller/testslash") 
    public void handleSlashRequest(){ 
     System.out.println("handleSlashRequest of class MyController"); 
    } 

    @RequestMapping(value="api/authors/mycontroller/test") 
    public void handleApiRequest(){ 
     System.out.println("handleApiRequest of class MyController"); 
    } 

    @RequestMapping(value="/api/authors/mycontroller/testslash") 
    public void handleSlashApiRequest(){ 
     System.out.println("handleSlashApiRequest of class MyController"); 
    } 

} 

jestem testowania 4 metody, ponieważ mam pewne wątpliwości co do właściwej mapowania być używany.

Dla każdego eksperymentu używam innego kontrolera z mapowaniem samosów, po prostu rozmyślam adnotację, której potrzebuję do tego eksperymentu.

Dzwonię te dwa adresy URL z HTTP GET:

http://localhost:8080/myApp/api/mycontroller/test 
http://localhost:8080/myApp/api/mycontroller/testslash 

Wynika to, że mogę uzyskać stosując @BasePathAwareController:

http://localhost:8080/myApp/api/mycontroller/test 
    White page, No errors, No print on console 

http://localhost:8080/myApp/api/mycontroller/testslash 
    White page, No errors, No print on console 

Jest to wynikiem korzystania @RepositoryRestController:

http://localhost:8080/myApp/api/mycontroller/test 
    White page, No errors, No print on console 

http://localhost:8080/myApp/api/mycontroller/testslash 
    White page, and this message on the console (only for the first HTTP GET on this url): 
    jul 27, 2016 9:23:57 AM org.springframework.web.servlet.DispatcherServlet noHandlerFound 
    WARNING: No mapping found for HTTP request with URI [/myApp/api/authors/mycontroller/testslash] in DispatcherServlet with name 'rest' 

Jest to wynik, jeśli używam @RestController:

http://localhost:8080/myApp/api/mycontroller/test 
    White page, in console: "handleRequest of class MyController" 

http://localhost:8080/myApp/api/mycontroller/testslash 
    White page, in console: "handleSlashRequest of class MyController" 

Wreszcie, jest to wynikiem korzystania @Controller:

http://localhost:8080/myApp/api/mycontroller/test 
    HTTP STATUS 404, in console: "handleRequest of class MyController" 

http://localhost:8080/myApp/api/mycontroller/testslash 
    HTTP STATUS 404, in console: "handleSlashRequest of class MyController" 

For both urls I have this warning: 

jul 27, 2016 9:28:11 AM org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/myApp/api/authors/mycontroller/authors/mycontroller/test] in DispatcherServlet with name 'rest' 

ja nie rozumiem, co się dzieje.

Jedyną adnotacją, która wydaje się zapewniać oczekiwany wynik, jest @RestController.

@Controller pozornie wydaje się działać, ale mam status HTTP 404 i tam jest wiadomość z niespójnego URL /myApp/api/authors/mycontroller/authors/mycontroller/test, mimo że jest prawidłowe obchodzenie się komunikat na konsoli.

Pozostałe dwie adnotacje (@BasePathAwareController i @RepositoryRestController) nie powodują żadnych problemów.

Podsumowując:

  • @BasePathAwareController: nie robić nic
  • @RepositoryRestController: nie robić nic
  • @Controller: dziwne zachowanie
  • @RestController: działa idealnie

Byłoby bardzo mile widziane każdy rodzaj clarifica na temat zachowania i użycia każdego rodzaju kontrolera.

Dzięki.

Odpowiedz

5

Znalazłem sposób na wykonanie pracy z wszystkimi opisanymi kontrolerami i udostępniam je tutaj.

@BasePathAwareController i @RepositoryRestControllermusi mieć @RequestMapping na poziomie klasy:

@RepositoryRestController 
//@BasePathAwareController 
@RequestMapping(value="/authors/mycontroller") 
public class MyController { 

    @RequestMapping(value="/test") 
    public void handleRequest(){ 
     //... 
    } 
} 

Bez mapowania na poziomie klasy, oba kontrolery nie są obsługiwane.

Jest to powód, ponieważ w moich poprzednich testach metody nigdy nie były wywoływane.

Mapowanie na poziomie klasy może zaczynać się od "/" lub nie, działa w obu przypadkach.

Ponadto zauważyłem, że dodanie <mvc:default-servlet-handler/> w kontekście konfiguracji, ostrzeżenie "Nie znaleziono mapowania dla żądania HTTP z URI" zniknęło.

+0

Proszę wyjaśnić, dlaczego w dokumentach jest napisane: "Ten kontroler (@RepositoryRestController) będzie obsługiwany z tej samej ścieżki bazowej API, zdefiniowanej w RepositoryRestConfiguration.setBasePath, która jest używana przez wszystkie inne punkty końcowe RESTful (np./Api)". Fragment kodu NIE MA też @RequestMapping na poziomie klasy. https://docs.spring.io/spring-data/rest/docs/3.0.1.RELEASE/reference/html/#customizing-sdr.overriding-sdr-response-handlers (rozdział 15.4) –

+0

źle, będą być obsługiwane z klasy obiektów zrzutu domeny lub ze ścieżki określonej w 'RepositoryRestResource (path =' – Sam

+0

To może zależeć od wersji, której używasz.Z wersją używaną w tym czasie rozwiązałem w ten sposób. –

0

Jak używasz REST API trzeba użyć @RestController

Dla dalszego czytania sprawdzeniu spring docs.

+0

Dzięki za odpowiedź. Ale w jakich warunkach mają być używane pozostałe? –

+0

Przeczytałem już dokumentację ... Jeśli tu jestem, to dlatego, że mam inny wynik, pomimo tego, co napisałem w dokumentacji. –