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

时间:2014-06-12 22:57:25

标签: java spring rest 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";
 }

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

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

2 个答案:

答案 0 :(得分:6)

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

如果您的意思是希望能够向/hello发送请求并获得两种不同的内容类型的答案,那么您可以这样做。

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

在这种情况下,您应该在HTTP请求中使用Accept标头,并将其设置为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() {...}

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

答案 1 :(得分:2)

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

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

@RequestMapping(value="/hello" params= param2)
public differentreturnType method2(@RequestParam("param2") p) { ... }

所以要处理第一个请求网址: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--