Контроллеры Spring Data Rest: поведение и использование @BasePathAwareController, @RepositoryRestController, @Controller и @RestController
я пытаюсь понять точное поведение контроллеров Spring Data Rest.
я сделал простую реализацию для тестирования 4 видов аннотированных контроллеров:@BasePathAwareController
, @RepositoryRestController
, @RestController
, @Controller
контроллер имеет сопоставление для сущности "автор" в репозитории.
это контроллер:
@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");
}
}
я тестирую 4 метода, потому что у меня есть некоторые сомнения относительно правильного отображения используемый.
для каждого эксперимента я использую другой контроллер с сопоставлениями sames, просто снимая аннотацию, которая мне нужна для этого эксперимента.
я вызываю эти два URL-адреса с HTTP GET:
http://localhost:8080/myApp/api/mycontroller/test
http://localhost:8080/myApp/api/mycontroller/testslash
это результат, который я получаю с помощью @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
это результат использования @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'
это результат, если я использую @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"
наконец, это результат используя @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'
я не понимаю, что происходит.
единственной аннотацией, которая, кажется, обеспечивает ожидаемый результат, является @RestController
.
@Controller
по-видимому, кажется, работает, но у меня есть статус HTTP 404, и есть сообщение с непоследовательным URL /myApp/api/authors/mycontroller/authors/mycontroller/test
, несмотря на то, что
правильное сообщение об обработке на консоли.
две другие аннотации (@BasePathAwareController
и @RepositoryRestController
) ничего не делать.
In резюме:
-
@BasePathAwareController
: ничего не делать -
@RepositoryRestController
: ничего не делать -
@Controller
: странное поведение -
@RestController
: работает отлично
было бы весьма признателен за любые разъяснения о поведении и использовании каждого вида @Controller.
спасибо.
2 ответов
я нашел способ заставить работать все аннотированный контроллеры, и я разделяю его здесь.
@BasePathAwareController
и @RepositoryRestController
должен быть @RequestMapping
на уровне класса:
@RepositoryRestController
//@BasePathAwareController
@RequestMapping(value="/authors/mycontroller")
public class MyController {
@RequestMapping(value="/test")
public void handleRequest(){
//...
}
}
без сопоставления на уровне класса, оба контроллера не обрабатываются.
это причина, потому что в моих предыдущих тестах методы никогда не вызывались.
отображение на уровне класса может начинаться с " / " или нет, оно работает в обоих случаи.
кроме того, я заметил, что добавление <mvc:default-servlet-handler/>
в контексте конфигурации, предупреждение "нет сопоставления для HTTP-запроса с URI" исчезла.
поскольку вы используете REST API, вам нужно использовать @RestController
для дальнейшего чтения, проверить spring docs.