Spring MVC 3: Returning XML through @ResponseBody

后端 未结 6 1545
渐次进展
渐次进展 2020-12-04 20:17

Pardon me for posting this noob question, but I have been debugging this problem for quite awhile now. I\'m having a little problem trying to get the response to return the

相关标签:
6条回答
  • 2020-12-04 20:30

    Try adding produces = MediaType.APPLICATION_XML_VALUE, i.e.

    @RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
    
    0 讨论(0)
  • 2020-12-04 20:31

    This can be done by adding the following bit of magic to the Spring context (see docs):

    <mvc:annotation-driven/>
    

    which amongst other things, provides:

    Support for reading and writing XML, if JAXB is present on the classpath.

    If JAXB is detected (i.e. if you're on Java6, or otherwise have some JAXB implementation on your classpath), this will register a Jaxb2RootElementHttpMessageConverter with the context, and will provide the ability to spit out XML from the return value of the @ResponseBody-annotated method.

    Note: Your question sort-of suggested using a ViewResolver for rendering the XML, but this isn't necessary. The @ResponseBody annotation is designed to bypass the view layer altogether.

    0 讨论(0)
  • 2020-12-04 20:33

    You will probably either have to use an XML Marshalling View or configure a MarshallingHttpMessageConverter.

    Here's a short Reference about using @ResponseBody with converters.

    0 讨论(0)
  • 2020-12-04 20:40

    Adding produces = MediaType.APPLICATION_XML_VALUE to the RequestMapping and @XmlRootElement to the top of your model object should works

    @RequestMapping(value = "/mylink", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE)
    public SomeObject doIt(){
        return new SomeObject();
    }
    
    @XmlRootElement
    public class SomeObject {
    
    }
    
    0 讨论(0)
  • 2020-12-04 20:49

    What I do when I want to return an XML representation of objects using spring is that I define a MarshallingView, e.g.,

    <!-- 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"/>
    

    Note that there is a whole world of alternatives to jaxb. The next step is

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

    Or if you want to use the ResponseBody annotation, it would look like:

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

    Note that this requires defining a HttpMessageConverter. See the spring documentation for a perfect sample on how to do this.

    0 讨论(0)
  • 2020-12-04 20:51

    I solved this problem with Spring 3 mvc without MarshallingView

    @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);
    }
    

    that's all. greetings

    0 讨论(0)
提交回复
热议问题