Spring MVC 3:通过@ResponseBody返回XML

请原谅我发布这个noob问题,但我现在已经调试了这个问题很长一段时间了。 我在尝试获取响应以基于对象返回XML时遇到一些问题: –

@RequestMapping(value = "/mylink", method = RequestMethod.GET) public @ResponseBody SomeObject doIt() { ... } 

现在,即使调用了该API,我的客户端也根本不会收到XML响应。 我一直在阅读一些地方,似乎我需要配置XML marshaller或一些XML解析器,但我不确定如何将该部分集成到我现有的配置中。 我目前在servlet.xml中有以下配置: –

        

有人可以发布一些示例配置,说明如何配置我的servlet.xml以使其正常工作吗? 非常感谢。

这可以通过在Spring上下文中添加以下一些魔法来完成(参见docs ):

  

除其他外,它提供:

如果类路径中存在JAXB,则支持读写XML。

如果检测到JAXB(即如果您使用的是Java6,或者在类路径上有一些JAXB实现),这将在上下文中注册一个Jaxb2RootElementHttpMessageConverter ,并将提供从@ResponseBody的返回值中吐出XML的@ResponseBody注释方法。

注意:您的问题排序建议使用ViewResolver来呈现XML,但这不是必需的。 @ResponseBody注释旨在完全绕过视图层。

我用没有MarshallingView的Spring 3 mvc解决了这个问题

 @RequestMapping(value = "actionName.xml", method = RequestMethod.GET) public HttpEntity getXml(ModelMap map, HttpServletResponse response) { String xml = generateSomeXml(); byte[] documentBody = xml.getBytes(); HttpHeaders header = new HttpHeaders(); header.setContentType(new MediaType("application", "xml")); header.setContentLength(documentBody.length); return new HttpEntity(documentBody, header); } 

就这样。 问候

当我想使用spring返回对象的XML表示时我做的是我定义一个MarshallingView,例如,

       com.company.AClass        

请注意,jaxb有一整套替代品。 下一步是

 @RequestMapping("/request") public ModelAndView sample() { return new ModelAndView("jaxbView", "data", "data_to_be_turned_into_xml"); } 

或者,如果您想使用ResponseBody注释,它看起来像:

 @RequestMapping("/request") @ResponseBody public void sample() { return "data_to_be_turned_into_xml" } 

请注意,这需要定义HttpMessageConverter 。 有关如何执行此操作的完美示例,请参阅spring文档。

您可能要么必须使用XML编组视图,要么配置MarshallingHttpMessageConverter

以下是关于将@ResponseBody与转换器一起使用的简短参考 。

尝试添加produces = MediaType.APPLICATION_XML_VALUE ,即

 @RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 

@XmlRootElement produces = MediaType.APPLICATION_XML_VALUE添加到RequestMapping,将@XmlRootElement到模型对象的顶部应该有效

 @RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) public SomeObject doIt(){ return new SomeObject(); } @XmlRootElement public class SomeObject { }