2009-12-21 6 views
2

Je marshaling avec succès un POJO dans JSON en utilisant des annotations JAX-RS et JAXB.Marshall/Unmarshall un JSON à une classe Java en utilisant JAXB

Le problème est que lorsque j'essaie d'utiliser la même chose pour désallouer ma requête, cela ne fonctionne pas. Pour autant que je puisse voir dans le documentation JAX-RS peut automatiquement marshaler et unmarshal application/json chaînes de retour aux classes Java.

Ai-je besoin de créer mon propre MessageBodyReader pour cela, ou cela est supporté par le framework sans utiliser les bibliothèques Jackson?

+0

quelle implémentation de JAX-RS utilisez-vous? – skaffman

Répondre

0

J'ai travaillé avec Apache Wink et pour cela j'ai dû utiliser un fournisseur JSON, tel que Jettison (un collègue utilisait Jackson). J'ai noté les étapes que j'ai suivies here

Je suppose que vous aussi devrez utiliser un fournisseur JSON. Y at-il une raison de ne pas utiliser un fournisseur Jackson?

2

Je l'ai fait avec succès dans RESTEasy. Je l'ai configuré pour consommer et produire à la fois XML et JSON. Voici un gestionnaire de requêtes:

@POST 
@Produces(["application/json","application/xml"]) 
@Consumes(["application/json","application/xml"]) 
@Path("/create") 
public Response postCreate(
     ReqData reqData) { 
    log.debug("data.name is "+ data.getName()); 
    ... 
    return Response.status(Response.Status.CREATED) 
    .entity(whatever) 
    .location(whateverURI) 
    .build(); 

} 

reqData est un JavaBean, à savoir, il dispose d'un constructeur par défaut et il a setters et getters que le signaleur trouve. Je n'ai pas de balises JSON spéciales dans ReqData, mais j'ai @XmlRootElement (name = "data") en haut pour les balises XML marshaller et @XmlElement sur les setters.

J'utilise des beans séparés pour l'entrée et la sortie, mais autant que je sache, vous pouvez utiliser le même bean.

Le programme client envoie la chaîne JSON dans le corps de l'entité de la demande et définit les en-têtes Context-Type et Accept sur "application/json".

4

La conversion en XML est facile, mais il m'a fallu un certain temps pour trouver comment passer à JSON. Assez simple après avoir trouvé la solution.

public static String marshalToXml(Object o) throws JAXBException { 

    StringWriter writer = new StringWriter(); 
    Marshaller marshaller = JAXBContext.newInstance(o.getClass()).createMarshaller(); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshal(o, writer); 
    return writer.toString(); 
} 

public static String marshalToJson(Object o) throws JAXBException { 

    StringWriter writer = new StringWriter(); 
    JAXBContext context = JSONJAXBContext.newInstance(o.getClass()); 

    Marshaller m = context.createMarshaller(); 
    JSONMarshaller marshaller = JSONJAXBContext.getJSONMarshaller(m); 
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
    marshaller.marshallToJSON(o, writer); 
    return writer.toString(); 
} 
+0

Cette réponse est tellement inutile. Qu'est-ce que JSONJAXBContex? Vous ne fournissez aucune information quoi que ce soit. –

+0

Il semble que ce soit com.sun.jersey.api.json.JSONJAXBContext depuis les anciennes versions de jersey-json. – seanf