Spring如何称呼这些@RequestMappings

时间:2016-05-16 20:55:51

标签: java spring spring-mvc

source code for Spring OAuth2's AuthorizationEndpoint包含两个针对同一@RequestMapping个端点的冗余/oauth/authorize注释。其中一个指定POST方法,而另一个未指定方法。

如何解释两个@RequestMapping注释?指定POST的请求是否专门处理所有POST /oauth/authorize个请求,并且未指定方法的请求是否专门处理对non-POST的任何/oauth/authorize个请求?或者两种方法都重叠,两种方法都被调用了某些请求?

这可能是一个Spring MVC问题,尽管GitHub上的源代码使用Spring MVC来定义什么是Spring OAuth2。

虽然GitHub上的完整源代码可以在本OP顶部的链接上找到,但两个相关方法的标题总结如下:

@RequestMapping(value = "/oauth/authorize")
public ModelAndView authorize(Map<String, Object> model, @RequestParam Map<String, String> parameters,
        SessionStatus sessionStatus, Principal principal) {

  //other stuff
}


@RequestMapping(value = "/oauth/authorize", method = RequestMethod.POST, params = OAuth2Utils.USER_OAUTH_APPROVAL)
public View approveOrDeny(@RequestParam Map<String, String> approvalParameters, Map<String, ?> model,
        SessionStatus sessionStatus, Principal principal) {

  //other stuff
}  

3 个答案:

答案 0 :(得分:2)

这已经解释过in the official documentation如果您提供method字段的值,它们将用于缩小映射。换句话说:Spring MVC将使用这些提示为每个请求找到最精确的匹配。

构建一个简单的概念验证应用程序也很容易,它在实践中展示了它:

@RequestMapping("/foo")
@ResponseBody
public String hello() {
  return "hello, default";
}

@RequestMapping(value="/foo", method = RequestMethod.GET)
@ResponseBody
public String helloGet() {
  return "hello, GET";
}

使用GET请求命中/foo,例如使用Postman,将返回“hello,GET”。所有其他支持的HTTP方法(POST,PUT,DELETE等)将导致“hello,default”。

答案 1 :(得分:-1)

Spring请求映射使用的默认方法是 GET ,因此如果您指定仅包含@RequestMapping注释的请求映射,Spring会将所有GET请求路由到注释的值这种方法。

要使用任何其他方法,您基本上需要在注释中说出方法。比如@RequestMapping(method = RequestMethod.POST

因此,对于您的示例,第一个方法将仅处理GET请求,而另一个方法将仅处理POST请求。

通常,OAuth中的GET用于正常解释,而POST用于使用传递给方法的param对未经身份验证的用户进行身份验证,在本例中为OAuth2Utils.USER_OAUTH_APPROVAL

答案 2 :(得分:-1)

  

如何解释两个@RequestMapping注释?

首先,从http://javatechig.com/java/spring/how-spring-controller-request-mapping-works-in-spring-mvc开始,默认值被解释为GET。这是第一个区别。其次,方法1请求Map<String, String>和另一种方法Map<String, ?>时,两种方法的参数略有不同。因此,即使两个方法都是GET,它仍然会在参数级别上进行区分。

  

指定POST的那个是否专门处理所有POST   / oauth / authorize请求,并执行未指定的请求   方法专门处理对/ oauth / authorize的任何非POST请求?   或者两种方法重叠,两种方法都被确定   请求?

POST专门处理帖子而不是其他内容。另一种方法只处理GET个请求。他们从不重叠。正如java的法律和Spring仍然受到java霸主的规则约束=)