如何强制spring @ResponseBody使用xml Convertor

时间:2011-09-07 13:21:21

标签: java spring http spring-mvc jaxb

当我从这样的控制器返回单个对象时,

@ResponseBody 
public MyClass module(...) {
...
}

我在客户端上获取xml输出并记录这样的显示,

  

2011-09-07 18:22:06,963 [qtp1409490836-27] DEBUG   org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter    - 将[com.domain.MyClass@4374820d]写成“application / xhtml + xml”   运用   [org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter@b4e1f3]

但如果我使用这样的列表,

@ResponseBody 
public List<MyClass> module(...) {
...
}

它使用jsonConvertor并返回json输出。

  

2011-09-07 18:38:31,026 [qtp420370595-26] DEBUG   org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter    - 写成[[com.domain.MyClass@654309f0]]为   “application / json; charset = UTF-8”使用   [org.springframework.http.converter.json.MappingJacksonHttpMessageConverter@14419f80]

MyClass使用jaxb注释。在球衣我可以说

@Produces({ MediaType.APPLICATION_XML })

如何强制spring始终使用xmlconverter?

2 个答案:

答案 0 :(得分:1)

有一些错误意味着您无法在列表中返回您的班级。您需要创建一个新类来保存对象列表并将其返回到@ResponseBody中。像这样:

@RequestMapping(value = Constants.URL, method = RequestMethod.GET)
public @ResponseBody ListHolder getFoos(HttpServletResponse response) {
    response.setContentType("application/xml");         
    List<Foo> foos = getFoos(); 
    ListHolder listHolder = new ListHolder();
    listHolder.setFoos(foos);
    return listHolder;
}

使用@XmlRootElement注释ListHolder类,如果你有jaxb jar或Java 6,那么它应该可以工作。

答案 1 :(得分:-1)

如果Spring无法找到JSON转换器,则无法发送JSON。尝试从类路径中删除jackson.jar,对于所有请求,它应该通过XStream默认为XML。