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.
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) –
źle, będą być obsługiwane z klasy obiektów zrzutu domeny lub ze ścieżki określonej w 'RepositoryRestResource (path =' – Sam
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. –