23 votes

Spring MVC 3 : Renvoyer du XML via @ResponseBody

Pardonnez-moi de poster cette question de débutant, mais je suis en train de déboguer ce problème depuis un bon moment maintenant. J'ai un peu de mal à faire en sorte que la réponse renvoie le XML en fonction de l'objet.

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

Actuellement, même si cette API est appelée, mon côté client ne reçoit pas du tout la réponse XML. J'ai lu quelques articles et il semble que je doive configurer le marshaller XML ou une sorte de résolveur XML, mais je ne sais pas comment intégrer cet élément dans ma configuration existante. J'ai actuellement la configuration suivante dans mon 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>

Quelqu'un peut-il gentiment poster des exemples de configurations sur la façon dont je pourrais configurer mon servlet.xml pour que cela fonctionne ? Merci beaucoup.

22voto

skaffman Points 197885

Pour ce faire, il suffit d'ajouter l'élément magique suivant au contexte de Spring (cf. docs ) :

<mvc:annotation-driven/>

qui prévoit, entre autres, que

Prise en charge de la lecture et de l'écriture de XML, si JAXB est présent dans le classpath.

Si JAXB est détecté (c'est-à-dire si vous êtes sous Java6, ou si vous avez une implémentation de JAXB dans votre classpath), il enregistrera un fichier de type Jaxb2RootElementHttpMessageConverter avec le contexte, et permettra d'extraire du XML de la valeur de retour de la fonction @ResponseBody -méthode annotée.

Note : Votre question suggère en quelque sorte d'utiliser un ViewResolver pour le rendu du XML, mais ce n'est pas nécessaire. Le site @ResponseBody L'annotation est conçue pour contourner complètement la couche d'affichage.

17voto

otmek Points 81

J'ai résolu ce problème avec Spring 3 mvc sans 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);
}

c'est tout. salutations

7voto

Johan Sjöberg Points 20759

Ce que je fais lorsque je veux renvoyer une représentation XML d'objets en utilisant spring, c'est que je définis un MarshallingView, par exemple,

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

Notez qu'il existe tout un monde de alternatives à jaxb. L'étape suivante est

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

Ou si vous voulez utiliser l'annotation ResponseBody, cela ressemblerait à ceci :

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

Notez que cela nécessite de définir un HttpMessageConverter . Voir le printemps pour un exemple parfait de la façon de procéder.

5voto

Sean Patrick Floyd Points 109428

2voto

Abdull Points 1666

Essayez d'ajouter produces = MediaType.APPLICATION_XML_VALUE c'est-à-dire

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X