2011-01-04 3 views
0

a rencontré un problème similaire comme le forum post suivant:unmarshalling tableau JSON via Jettison/Resteasy

http://jersey.576304.n2.nabble.com/parsing-JSON-with-Arrays-using-Jettison-td5732207.html

En utilisant Resteasy 2.0.1GA avec Jettison 1.2 et l'obtention d'un problème lorsque des réseaux de triage impliquant les correspondances d'espace de noms. Voir le code ci-dessous. Fondamentalement, si le nombre d'entrées de tableau est supérieur à un et que les mappages d'espaces de noms sont utilisés. Quelqu'un d'autre a rencontré ce problème? L'affiche de forme de Nabble l'a contourné en écrivant un unmarshaller personnalisé. Je dois soit isoler le bogue de Jettison ou écrire une extension Resteasy de la classe JettisonMappedUnmarshaller (qui remet les mappages d'espace de noms et unmarshaller à la configuration de Jettison).

Le code suivant ne pas unmarshall (étape de post) si les variables de propriétés contiennent 2 entrées ou plus.


public class Experimenting { 

    @Path("test") 
    public static class MyResource { 
     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlType(name = "Property", propOrder = { "name", "value" }) 
     public static class MyProperty { 
      @XmlElement(name = "Name", required = true) 
      protected String name; 
      @XmlElement(name = "Value", required = true) 
      protected String value; 

      public String getName() { 
       return name; 
      } 

      public void setName(String name) { 
       this.name = name; 
      } 

      public String getValue() { 
       return value; 
      } 

      public void setValue(String value) { 
       this.value = value; 
      } 
     } 

     @XmlType(name = "MyElement", propOrder = { "myProperty" }) 
     @XmlAccessorType(XmlAccessType.FIELD) 
     @XmlRootElement(name = "MyElement", namespace = "http://www.klistret.com/cmdb/ci/commons") 
     @Mapped(namespaceMap = { @XmlNsMap(namespace = "http://www.klistret.com/cmdb/ci/commons", jsonName = "com.klistret.cmdb.ci.commons") }) 
     public static class MyElement { 
      @XmlElement(name = "MyProperty", namespace = "http://www.klistret.com/cmdb/ci/commons") 
      protected List myProperty; 

      public List getMyProperty() { 
       if (myProperty == null) { 
        myProperty = new ArrayList(); 
       } 
       return this.myProperty; 
      } 

      public void setMyProperty(List myProperty) { 
       this.myProperty = myProperty; 
      } 
     } 

     @GET 
     @Path("myElement/{id}") 
     @Produces(MediaType.APPLICATION_JSON) 
     public MyElement getMy(@PathParam("id") 
     Long id) { 
      MyElement myElement = new MyElement(); 

      MyProperty example = new MyProperty(); 
      example.setName("example"); 
      example.setValue("of a property"); 

      MyProperty another = new MyProperty(); 
      another.setName("another"); 
      another.setValue("just a test"); 

      MyProperty[] properties = new MyProperty[] { example, another }; 
      myElement.setMyProperty(Arrays.asList(properties)); 

      return myElement; 
     } 

     @POST 
     @Path("/myElement") 
     @Consumes(MediaType.APPLICATION_JSON) 
     @Produces(MediaType.APPLICATION_JSON) 
     public MyElement createMy(MyElement myElement) { 
      List properties = myElement.getMyProperty(); 
      System.out.println("Properties size: " + properties.size()); 

      return myElement; 
     } 
    } 

    private Dispatcher dispatcher; 

    @Before 
    public void setUp() throws Exception { 
     // embedded server 
     dispatcher = MockDispatcherFactory.createDispatcher(); 
     dispatcher.getRegistry().addPerRequestResource(MyResource.class); 

    } 

    @Test 
    public void getAndCreate() throws URISyntaxException, 
      UnsupportedEncodingException { 
     MockHttpRequest getRequest = MockHttpRequest.get("/test/element/44"); 
     MockHttpResponse getResponse = new MockHttpResponse(); 

     dispatcher.invoke(getRequest, getResponse); 
     String getResponseBodyAsString = getResponse.getContentAsString(); 

     System.out.println(String.format(
       "Get Response code [%s] with payload [%s]", getResponse 
         .getStatus(), getResponse.getContentAsString())); 

     MockHttpRequest postRequest = MockHttpRequest.post("/test/element"); 
     MockHttpResponse postResponse = new MockHttpResponse(); 

     postRequest.contentType(MediaType.APPLICATION_JSON); 
     postRequest.content(getResponseBodyAsString.getBytes("UTF-8")); 

     dispatcher.invoke(postRequest, postResponse); 
     System.out.println(String.format(
       "Post Response code [%s] with payload [%s]", postResponse 
         .getStatus(), postResponse.getContentAsString())); 
    } 
} 
+0

L'utilisation de BadgerFish sur les paramètres Get return et Post/retour fonctionne correctement. –

Répondre

1

Avez-vous besoin d'utiliser Jettison? Si ce n'est pas le cas, je recommanderais simplement de passer à Jackson à la place; cela résout généralement les problèmes liés au tableau/liste (le problème avec Jettison est qu'il convertit en modèle XML, ce qui rend très difficile de distinguer les tableaux des objets - il y a aussi des bugs, mais il est fondamentalement difficile de fonctionner correctement).

+0

Les annotations sous-jacentes sont JAXB et Jackson à partir de la petite lecture que j'ai faite ne supporte qu'un sous-ensemble d'annotations JAXB. Commuté sur Badgerfish avec résolu le problème ci-dessus, mais a rencontré un problème avec les tableaux de chaînes unmarshalling. :-) Peut marhsall/unmarshall un tableau de chaîne en utilisant localement des classes Mock Resteasy mais par l'intermédiaire du serveur le même JSON donne une erreur d'analyseur de chaîne. Bizarre. –

+0

Jackson prend en charge à peu près toutes les annotations qui ont du sens - de nombreuses annotations JAXB sont spécifiques à XML et ne s'appliquent pas. Mais seulement utilisé pas pris en charge que j'ai entendu quelqu'un souhaiter avoir été pour XmlID. Donc, ce n'est généralement pas problématique. De plus, la plupart du temps, aucune annotation n'est nécessaire (Jackson a son propre jeu, JAXB est supporté mais pas réellement recommandé, en raison de la spécificité xml). Mais si le badgerfish fonctionne, c'est bien. C'est foutu, mais bon à chacun le sien. :) – StaxMan