1

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

@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 aCollection<Object>Map<String, Object>. 这不适用于 XML。我宁愿返回一个Project对象。

是否有一种干净的方法来确定将生成哪种内容类型?解决方法是另一种仅生成 XML 并返回Project对象的方法。我宁愿避免重复代码。

我在 Spring 3.1.3-RELEASE 上。

4

5 回答 5

2

根据 Spring 文档,您的生产参数将根据 Accept 返回内容,即

@RequestMapping(value="/someUrl/", produces="application/*")
public Project someControllerMethod(...)

如果该方法采用 application/xml,该方法将生成 XML,如果是 application/json,则该方法将生成 json 等。

您只需要为适当的对象类型设置编组器。

此处的文档:

http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html#produces ()

于 2012-11-07T18:25:05.667 回答
0

要生成的内容类型将取决于客户端可接受的类型。已经提到了一个解决方案,使用产生属性。另一个解决方案是使用 ContentNegotiatingViewResolver,它可以根据接受标头或其他机制解析视图。

请参阅文档http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/servlet/view/ContentNegotiatingViewResolver.html

示例:http ://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/

于 2012-11-08T05:30:37.680 回答
0

尽管如此,我认为 Dardo 的解决方案是最好的,您可以使用 XMLHttpMessageConverter 检查对象类型,如果它是 Project 对象,则可以进行不同的转换。

于 2012-11-13T21:55:06.230 回答
0

在 Spring Framework 4.1 中,您可以使用 ResponseBodyAdvice 在写出之前修改从 @ResponseBody 或 ResponseEntity 方法返回的值。

请参阅http://docs.spring.io/spring-framework/docs/4.1.0.RC2/javadoc-api/org/springframework/web/servlet/mvc/method/annotation/ResponseBodyAdvice.html

于 2014-08-21T13:40:11.043 回答
-3

我最终分成了两种方法。

公共方法已重命名为lookupAsType. 委托/返回

String[] fieldsArray = StringUtils.split(fields, ',');
return lookup(project, fieldsArray, asList, mediaType);

新方法lookup与之前的代码相同,但不包含媒体类型的 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 + "'");
}

不好的是 MediaType 不是枚举而是丑陋的类。

于 2012-11-08T10:46:13.110 回答