带有Spring WebMVC REST控制器的基于接受标头的不同响应实体主体



我有一个具有这样的方法签名的控制器

@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 + "'");
}

不好的是,介体不是枚举,而是一个丑陋的阶级。

最新更新