Контроллеры 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.