web-dev-qa-db-fra.com

printemps réponse au repos MVC json et xml

J'ai l'obligation de renvoyer le résultat de la base de données sous forme de chaîne xml-structure ou json-structure ..__ J'ai une solution, mais je ne sais pas si celle-ci est le meilleur moyen de résoudre ce . J'ai deux méthodes ici:

@RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET)
public ResponseEntity<String> getContentByIdsAsJSON(@PathVariable("ids") String ids)
{
  String content = null;
  StringBuilder builder = new StringBuilder();
  HttpHeaders responseHeaders = new HttpHeaders();
  responseHeaders.add("Content-Type", "text/html; charset=utf-8");
  // responseHeaders.add("Content-Type", "application/json; charset=utf-8");

  List<String> list = this.contentService.findContentByListingIdAsJSON(ids);
  if (list.isEmpty())
  {
     content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><error>no data  found</error>";
     return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
  }
  for (String json : list)
  {
     builder.append(json + "\n");
  }
  content = builder.toString();
  return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}

@RequestMapping(value = "/content/{ids}", method = RequestMethod.GET)
public ResponseEntity<String> getContentByIdsAsXML(@PathVariable("ids") String ids)
{
  HttpHeaders responseHeaders = new HttpHeaders();
  responseHeaders.add("Content-Type", "application/xml; charset=utf-8");

  String content = this.contentService.findContentByListingIdAsXML(ids);
  if (content == null)
  {
     content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><error>no data found</error>";
     return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
  }
  return new ResponseEntity<String>(content, responseHeaders, HttpStatus.CREATED);
}

pour la première méthode, il me faut une meilleure solution, ce que j’avais déjà demandé ici: spring mvc rest mongo dbobject response

Ensuite, j’ai inséré dans la configuration un convertisseur JSON:

<bean id="jsonHttpMessageConverter"
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
   <property name="supportedMediaTypes" value="application/json"/>
</bean>

lorsque je change le type de contenu de la première méthode en "application/json", cela fonctionne, mais la réponse xml ne fonctionne plus car le convertisseur json souhaite convertir la chaîne xml en json-structure, je pense.

que puis-je faire, ce printemps identifie la différence que l'une des méthodes doit renvoyer un type json et l'autre une chaîne xml normale en tant que chaîne? Je l'ai essayé avec le drapeau accept:

@RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET, headers = "Accept=application/json")

mais ça ne marche pas. Je reçois l'erreur suivante:

org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is Java.lang.StackOverflowError

J'espère que quelqu'un pourra m'aider.

13
Simon Hofstadler

Si vous utilisez Spring 3.1, vous pouvez tirer parti du nouvel élément produces de l'annotation @RequestMapping pour vous assurer de produire du code XML ou JSON à votre guise, même au sein de la même application.

J'ai écrit un post à ce sujet ici:

http://springinpractice.com/2012/02/22/supporting-xml-and-json-web-service-endpoints-in-spring-3-1-using-responsebody/

13
Willie Wheeler

Whoa ... quand vous travaillez avec Spring, supposez que quelqu'un d'autre se soit heurté au même problème. Vous pouvez vider toute la génération JSON côté serveur, car tout ce que vous avez à faire est:

  1. Inclure les fichiers JAR Jackson JSON dans votre application
  2. Définissez le type de retour RequestMapping sur @ResponseBody(yourObjectType)

Spring convertira automatiquement votre objet en JSON par magie. Vraiment. Fonctionne comme par magie.

Doc pour @ResponseBody: http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mvc.html#mvc-ann-responsebody

8
atrain

Vous pouvez utiliser ContentNegotiatedViewResolver comme ci-dessous: 

<bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
    <property name="defaultContentType" value="application/json" />
    <property name="ignoreAcceptHeader" value="true" />
    <property name="favorPathExtension" value="true" />
    <property name="order" value="1" />
    <property name="mediaTypes">
        <map>
            <entry key="xml" value="application/xml" />
            <entry key="json" value="application/json" />
        </map>
    </property>
    <property name="defaultViews">
        <list>
            <ref bean="xmlView"/>
            <ref bean="jsonView"/>
        </list>
    </property>
</bean>

<bean id="jsonView"
      class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
    <property name="contentType" value="application/json;charset=UTF-8"/>
    <property name="disableCaching" value="false"/>
</bean>

<bean id="xmlView"
      class="org.springframework.web.servlet.view.xml.MarshallingView">
    <property name="contentType" value="application/xml;charset=UTF-8"/>
    <constructor-arg>
        <ref bean="xstreamMarshaller"/>
    </constructor-arg>
</bean>


<bean id="xstreamMarshaller" class="org.springframework.oxm.xstream.XStreamMarshaller">
    <property name="autodetectAnnotations" value="true" />
    <property name="annotatedClass" value="demo.domain.xml.XMLResponse"/>
    <property name="supportedClasses" value="demo.domain.xml.XMLResponse"/>
</bean>

Dans votre contrôleur: 

@RequestMapping(value = "/get/response.json", method = RequestMethod.GET)
public JSONResponse getJsonResponse(){
    return responseService.getJsonResponse();
}
@RequestMapping(value = "/get/response.xml", method = RequestMethod.GET)
public  XMLResponse getXmlResponse(){
    return responseService.getXmlResponse();
}
4
Mark

Si quelqu'un utilise la réponse Spring Boot for XML, ajoutez la dépendance suivante,

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
</dependency>

Et dans la classe de modèle que vous renvoyez, ajoutez le @XmlRootElement.

@Entity
@Table(name = "customer")
@XmlRootElement
public class Customer {
      //... fields and getters, setters
}

et dans votre contrôleur, ajoutez produces="application/xml". Cela produira la réponse au format XML.

1
Lucky

Ici, j'ai écrit une méthode qui prend XML comme paramètre de requête à partir de votre URL de mappage de requête

Ici, je poste du XML sur mon URL "baseurl/user/createuser /"

    public class UserController {
    @RequestMapping(value = "createuser/" ,
    method=RequestMethod.POST,  consumes= "application/xml")
    @ResponseBody
    ResponseEntity<String> createUser(@RequestBody String requestBody ) {

        String r = "<ID>10</ID>"; // Put whatever response u want to return to requester

    return new ResponseEntity<String>(
              "Handled application/xml request. Request body was: " 
              + r, 
              new HttpHeaders(), 
              HttpStatus.OK);       


    }
}

Je l'ai testé en utilisant chrome poster où vous pouvez envoyer n'importe quel xml dans le corps du contenu comme:

"<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <userEntity><id>3</id><firstName>saurabh</firstName><lastName>shri</lastName><password>pass</password><userName>[email protected]</userName></userEntity>"

Ce XML capturera par ma méthode createUser et sera stocké dans String requestBody que je pourrai utiliser davantage

0
Saurabh

La manière la plus simple de procéder pour obtenir une réponse JSON serait la suivante: Avec Spring 3.1, vous pouvez procéder comme suit: 

  1. Dans votre fichier pom.xml (en espérant que vous utilisez un projet maven), ajoutez une dépendance maven pour jackson-mapper ( http://mvnrepository.com/artifact/org.codehaus.jackson/jackson-mapper-asl/1.9. 13 )

  2. Modifiez votre code comme suit et testez le noeud final sur postman:

    @RequestMapping(value = "/content/json/{ids}", method = RequestMethod.GET)
    public @ResponseBody String getContentByIdsAsJSON(@PathVariable("ids") String ids){
        String content = "";
        StringBuilder builder = new StringBuilder();
    
        List<String> list = this.contentService.findContentByListingIdAsJSON(ids);
        if (list.isEmpty()){
            content = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><error>no data found</error>";
            return content;
        }
        for (String json : list){
            builder.append(json + "\n");
        }
    
        content = builder.toString();
        return content;
    }
    
0
Jobin Thomas