请原谅我发布这个noob问题,但我现在已经调试了这个问题很长一段时间了。我在尝试获取响应以基于对象返回XML时遇到了一些问题: -
@RequestMapping(value = "/mylink", method = RequestMethod.GET)
public @ResponseBody SomeObject doIt() {
...
}
现在,即使调用了该API,我的客户端也根本不会收到XML响应。我一直在阅读一些地方,似乎我需要配置XML marshaller或一些XML解析器,但我不确定如何将该部分集成到我现有的配置中。我目前在servlet.xml中有以下配置: -
<context:component-scan base-package="ss.controller" />
<mvc:annotation-driven />
<mvc:resources location="/resources/" mapping="/resources/**" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/app/" />
<property name="suffix" value=".jsp" />
</bean>
有人可以发布一些示例配置,说明如何配置我的servlet.xml以使其正常工作吗?非常感谢。
答案 0 :(得分:22)
这可以通过在Spring上下文中添加以下一些魔法来实现(参见docs):
<mvc:annotation-driven/>
除其他外,提供:
如果类路径中存在JAXB,则支持读写XML。
如果检测到JAXB(即如果您使用的是Java6,或者在类路径上有一些JAXB实现),这将在上下文中注册Jaxb2RootElementHttpMessageConverter
,并提供从中吐出XML的能力@ResponseBody
- 带注释的方法的返回值。
注意:您的问题排序建议使用ViewResolver
来呈现XML,但这不是必需的。 @ResponseBody
注释旨在完全绕过视图层。
答案 1 :(得分:16)
我用没有MarshallingView的Spring 3 mvc解决了这个问题
@RequestMapping(value = "actionName.xml", method = RequestMethod.GET)
public HttpEntity<byte[]> 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<byte[]>(documentBody, header);
}
就是这样。问候
答案 2 :(得分:7)
当我想使用spring返回对象的XML表示时我做的是我定义一个MarshallingView,例如,
<!-- XML view using a JAXB marshaller -->
<bean id="jaxbView" class="org.springframework.web.servlet.view.xml.MarshallingView">
<constructor-arg>
<bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.company.AClass</value>
</list>
</property>
</bean>
</constructor-arg>
</bean>
<!-- Resolve views based on string names -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
请注意,整个世界都有alternatives到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文档。
答案 3 :(得分:5)
答案 4 :(得分:2)
尝试添加produces = MediaType.APPLICATION_XML_VALUE
,即
@RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
答案 5 :(得分:0)
将IBaseClass.SetController
添加到RequestMapping并将BaseClass
添加到模型对象的顶部应该有效
produces = MediaType.APPLICATION_XML_VALUE