我已经设置了我的控制器,以便它将通过客户端设置的HTTP Accept-Type标头以请求的格式返回数据:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jacksonJSONMessageConverter" />
<ref bean="jaxbXMLConverter" />
<ref bean="jsonpMessageConverter" />
</list>
</property>
</bean>
样本控制器方法:
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public TestObject executeTest()
{
TestObject t = ...
// not important, generating t
return t;
}
所以他们会这样做:http:// someurl / test
完全正常工作如果客户端实际上可以设置Accept-Type。现在,当客户端无法设置Accept-Type标头时问题就开始了,我会依赖url作为后缀,例如:
我的挑战是如何正确配置Spring来做到这一点?
一些建议:
和其他许多人一样,但是没有一个解决方案似乎能够满足我所需要的一个漂亮,干净的原因。理想情况下,我希望能够像
那样做一些干净的事情@RequestMapping(value = "/test.xml", method = RequestMethod.POST)
@ResponseBody
public TestObject executeTestReturnXML()
{
TestObject t = executeTest();
return t; // somehow magically force Spring converter to convert it to XML
}
@RequestMapping(value = "/test.json", method = RequestMethod.POST)
@ResponseBody
public TestObject executeTestReturnJson()
{
TestObject t = executeTest();
return t; // somehow magically force Spring converter to convert it to JSON
}
@RequestMapping(value = "/test.jsonp", method = RequestMethod.POST)
@ResponseBody
public TestObject executeTestReturnJsonP(@RequestParam(value = "callback", required = true) String callback)
{
TestObject t = executeTest();
return t; // somehow magically force Spring converter to convert it to JSON-P with callback wrapper
}
建议和/或指示将不胜感激!
答案 0 :(得分:2)
Spring MVC 3.0+引入了ContentNegotiatingViewResolver
,它具有您所寻求的确切功能。
ViewResolver的实现,它根据请求文件名或Accept标头解析视图。
此博文可以帮助您:http://blog.springsource.org/2013/06/03/content-negotiation-using-views/
答案 1 :(得分:0)
您可以使用Spring 3.1中引入的@Produces注释。看看实际的文档http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-ann-requestmapping-produces 并在Spring Jira(https://jira.springsource.org/browse/SPR-7213)中寻找一些背景