Spring MVC在端点上使用相同的路径返回不同的内容?

Env*_*vin 1 java rest spring spring-mvc

我将使用一个非常基本的hello world端点作为示例

 @RequestMapping("/hello")
 public String hello(@RequestParam(value="name", required=false, defaultValue="World") String name, Model model) {
     model.addAttribute("name", name);
     return "helloworld";
 }
Run Code Online (Sandbox Code Playgroud)

如果我有这个端点,我希望能够转到/ hello并检索helloworld视图.

/hello如果我传入一个像内容类型这样的特定请求参数,我是否可以使用SAME 路径将模型检索为json?

Sot*_*lis 6

我不确定我明白你的意思.

如果您的意思是希望能够发送请求/hello并获得两个不同的响应,具有不同的内容类型,是的,您可以这样做.

@RequestMapping 将方法标识为请求处理程序,但它还提供了限制何时应使用处理程序的选项.

在这种情况下,您应该Accept在HTTP请求中使用标头,并将其设置application/json为包含JSON text/html的响应和包含HTML的响应.

然后你可以有两种@RequestMapping方法

@RequestMapping(value = "/hello", produces = "application/json")
public SomeType handleJson() {...}

@RequestMapping(value = "/hello", produces = "text/html")
public String handleHtml() {...}
Run Code Online (Sandbox Code Playgroud)

Spring将根据请求的Accept标头和方法的produces值确定使用哪种方法.


小智 6

您可以尝试使用RequestMapping params选项传入参数。这确实需要修改 URL,但映射仍然相同,并且可以添加没有 params 标记的映射方法作为默认值。

@RequestMapping(value="/hello" params= param1)
public returnType method(@RequestParam("param1") p) { ... }

@RequestMapping(value="/hello" params= param2)
public differentreturnType method2(@RequestParam("param2") p) { ... }
Run Code Online (Sandbox Code Playgroud)

所以要处理第一个,请求 URL :http://etc.com/hello?param1=x和第二个http://etc.com/hello?param2=y

@RequestMapping文档的参数部分:http : //docs.spring.io/spring/docs/4.0.5.RELEASE/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#params--