Spring Data Rest控制器:@BasePathAwareController,@ RepositoryRestController,@ Controller和@RestController

时间:2016-07-27 08:14:09

标签: spring spring-mvc spring-data-rest

我正在尝试了解Spring Data Rest Controller的确切行为。

我做了一个简单的实现来测试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种方法,因为我对要使用的正确映射有一些疑问。

对于每个实验,我使用具有相同映射的不同控制器,只需取消注释该实验所需的注释。

我用HTTP GET调用这两个URL:

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,并且有一条消息包含不一致的网址/myApp/api/authors/mycontroller/authors/mycontroller/test,尽管有 控制台上的正确处理消息。

其他两个注释(@BasePathAwareController@RepositoryRestController)不会做任何事情。

总结:

  • @BasePathAwareController:什么都不做
  • @RepositoryRestController:什么都不做
  • @Controller:奇怪的行为
  • @RestController:效果很好

对于各种@Controller的行为和用法,我们将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:7)

我找到了所有带注释的控制器的工作方式,我在这里分享。

@BasePathAwareController@RepositoryRestController 必须在班级@RequestMapping

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

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

如果没有类级别的映射,则不会处理两个控制器

原因是因为在我之前的测试中从未调用过这些方法。

班级的映射可以以" /"开头。或不是,它适用于这两种情况。

此外,我注意到在配置上下文中添加了<mvc:default-servlet-handler/>,警告&#34;找不到带有URI&#34; 的HTTP请求的映射。

答案 1 :(得分:-1)

当您使用REST API时,您需要使用@RestController

如需进一步阅读,请查看spring docs