Spring MVC 3:通过@ResponseBody返回XML

lim*_*imc 23 java xml spring-mvc

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

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

现在,即使调用该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>
Run Code Online (Sandbox Code Playgroud)

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

ska*_*man 22

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

<mvc:annotation-driven/>
Run Code Online (Sandbox Code Playgroud)

除其他外,它提供:

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

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

注意:您的问题排序建议使用a ViewResolver来呈现XML,但这不是必需的.该@ResponseBody注释被设计成完全绕过视图层.

  • 除了添加jaxb-api.jar和jaxb-impl.jar(我使用的是Java5)之外,我还必须使用@XmlRootElement注释`SomeObject` ......一切都像魅力一样.谢谢你的帮助! (6认同)

小智 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);
}
Run Code Online (Sandbox Code Playgroud)

就这样.问候


Joh*_*erg 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"/>
Run Code Online (Sandbox Code Playgroud)

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

@RequestMapping("/request")
public ModelAndView sample() {
    return new ModelAndView("jaxbView", "data", "data_to_be_turned_into_xml");
}
Run Code Online (Sandbox Code Playgroud)

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

@RequestMapping("/request")
@ResponseBody
public void sample() {
    return "data_to_be_turned_into_xml"
}
Run Code Online (Sandbox Code Playgroud)

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