2015-11-23 1 views
1

J'ai un POJO appelé Container que je veux envoyer au service Web RESTful.Convertir LinkedHasmap en POJO?

côté client:

try { 

     JAXBContext ctx = JAXBContextFactory.createContext(new Class[] {Container.class}, null);    
     jsonContent = objectToJSON(ctx, cont); 
     HttpEntity entity = new ByteArrayEntity(jsonContent.getBytes("UTF-8")); 
     ((HttpPost) httpUriRequest).setEntity(entity); 

    } catch (JAXBException e) { 
     e.printStackTrace(); 
    } catch (UnsupportedEncodingException e) { 
     e.printStackTrace(); 
    } 

    public String objectToJSON(JAXBContext ctx, Object object) 
      { 
       try 
       { 
        Marshaller marshaller = ctx.createMarshaller(); 

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json"); 
        marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false); 

        StringWriter sw = new StringWriter(); 
        marshaller.marshal(object, sw); 

        return sw.toString(); 
       } 
       catch (JAXBException e){ 

        System.out.println("--------JAXB EXCEPTION------------\n"); 
        e.printStackTrace(); 
        LOGGER.error("JAXB marshalling error!", e); 
       } 
       return "HELLO"; 
      } 

J'utilise REST facile.

côté serveur

@POST 

    @Consumes({"application/json"}) 
    @Produces({"application/json"}) 
    public String handlePostRequest(Object resource) { 

     System.out.println("\nINSIDE HANDLE POST: CONTENT CLASS" + resource.getClass()); 
     System.out.println("\nINSIDE HANDLE POST: " + resource); 
     return "SIDD"; 
    } 

Ici, je reçois le contenu envoyé comme Object Type: public String handlePostRequest(Object resource) {

Alors imprime SOP la classe comme LinkedHashMap et les attributs de mon POJO (Container) sont situés dans le HashMap comme paire de valeur de clé.

Ici, je veux utiliser le type Object car mes POJO envoyés du client peuvent différer entre les demandes. Donc, je veux écrire une fonction générique.

Maintenant, y at-il un moyen standard pour convertir LinkedHashMap (en passant en tant qu'objet) à mon POJO en java ??

Répondre

1

Vous pouvez envelopper votre objet carte dans un POJO comme ceci:

@Getter 
@Setter 
public class MyResource { 
    @JsonProperty("map") 
    private Map<Integer,Object> map; // or LinkedHashMap if you want 

    // You can have other fields here 
} 

Votre signature de la méthode ressemblerait à ceci:

@POST 
@Consumes("application/json") 
@Produces("application/json") 
public String handlePostRequest(MyResource resource) { 
    // Access your map 
    resource.getMap(); 
} 

JacksonJaxbJsonProvider-ce que le marshalling & unmarshalling pour vous. L'entrée de votre service RESTful ressemblerait à ceci:

{ 
"map": { 
    "1" : "Hello", 
    "2" : "World", 
    ... 
    } 
} 
+0

Dans ce cas, quel sera le code client? Par exemple actuellement je fais: 'JAXBContext ctx = JAXBContextFactory.createContext (nouvelle classe [] {Container.class}, null); jsonContent = objetToJSON (ctx, cont); '. Cela fournit une chaîne json de la classe 'Container' –

+0

Vous pouvez utiliser' GsonBuilder' de 'com.google.gson' pour convertir un objet en JSON; quelque chose comme 'new GsonBuilder(). create(). toJson (votreObjet)'. Ensuite, donnez ce JSON au corps de la requête. – Egemen