我有一个具有这样的方法签名的控制器
@RequestMapping(value = "/{project:[A-Z0-9_+\.\(\)=\-]+}", method = RequestMethod.GET)
public ResponseEntity<Object> lookupProject(@PathVariable String project,
@RequestParam(value = "fields", required = false) String fields,
@RequestParam(value = "asList", required = false, defaultValue = "false") boolean asList);
我正在返回JSON A Collection<Object>
或Map<String, Object>
。这不适合XML。我宁愿返回Project
对象。
是否有一种干净的方法来确定将产生哪种内容类型?工作环境将是另一种仅产生XML并返回Project
对象的方法。我想避免重复代码。
我在春季3.1.3释放。
根据春季文档,您的生产参数将根据接受,即
返回内容@RequestMapping(value="/someUrl/", produces="application/*")
public Project someControllerMethod(...)
如果该方法包含Application/XML,则该方法将产生XML,如果应用程序/JSON会产生JSON等。
您只需要为适当的对象类型设置编织者。
文档在这里:
http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/web/bind/bind/annotation/requestmappation.html#produces()
要生产的内容类型将取决于客户端可接受的类型。一种解决方案已经提到了,使用aspores attribute.Ane Ane Anerse使用ContentNegotiatingViewResolver,该解决方案可以基于ACCEPT解决视图。标题或其他机制。
请参阅文档http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframewramework/web/web/servlet/view/contentnegotiatnegotiatingviewviewviewviewviewviewviewviewviewviewviewview.html
示例:http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewsolver-example/
尽管我认为达尔多的解决方案是最好的,您可以使用XMLHTTPMESSAGECONVERTER检查对象类型,如果它是项目对象,则可以使用不同的铸造。
在弹簧框架4.1中您可以使用响应bodyAdvice在写出之前从@Responsebody或响应式方法返回的值。
p>我最终以两种方法分裂。
公共方法已重命名为lookupAsType
。两个委托/返回
String[] fieldsArray = StringUtils.split(fields, ',');
return lookup(project, fieldsArray, asList, mediaType);
新方法lookup
之前具有相同的代码s,但不包含媒体类型的if子句。
if (mediaType.equals(MediaType.APPLICATION_JSON)) {
body = projectValues;
} else if (mediaType.equals(MediaType.APPLICATION_XML)) {
body = new Project(projectValues);
} else {
throw new NotImplementedException("Project lookup is not implemented for media type '" + mediaType + "'");
}
不好的是,介体不是枚举,而是一个丑陋的阶级。