Je suis l'aide de Jersey pour créer un service web REST pour un composant serveur.
Le JAXB-annoté objet que je veux pour sérialiser dans une liste ressemble à ceci:
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
J'ai un RESTE de ressources pour récupérer une distribution qui ressemble à ceci:
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
J'ai aussi un RESTE de ressources pour récupérer une liste de toutes les distributions, qui ressemble à ceci:
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
J'utilise un ContextResolver pour personnaliser JAXB la sérialisation, qui est actuellement configuré comme ceci:
@Provider
@Produces("application/json")
public class JAXBJSONContextResolver implements ContextResolver<JAXBContext> {
private JAXBContext context;
public JAXBJSONContextResolver() throws Exception {
JSONConfiguration.MappedBuilder b = JSONConfiguration.mapped();
b.nonStrings("id");
b.rootUnwrapping(true);
b.arrays("distribution");
context = new JSONJAXBContext(b.build(), XMLDistribution.class);
}
@Override
public JAXBContext getContext(Class<?> objectType) {
return context;
}
}
Les deux RESTE des ressources de travail, ainsi que le contexte de résolution. Ceci est un exemple de sortie pour le premier:
// path: /distribution/1
{"id":1,"name":"Example Distribution"}
Ce qui est exactement ce que je veux. Ceci est un exemple de sortie de la liste:
// path: /distributions
{"distribution":[{"id":1,"name":"Sample Distribution 1"},{"id":2,"name":"Sample Distribution 2"}]}
Ce qui n'est pas tout à fait ce que je veux.
Je ne comprends pas pourquoi il y a un enfermant distribution
balise. J'ai voulu l'enlever avec .rootUnwrapping(true)
dans le contexte de résolution, mais apparemment ce ne supprime une autre balise englobante. C'est la sortie avec .rootUnwrapping(false)
:
// path: /distribution/1
{"distribution":{"id":1,"name":"Example Distribution"}} // not ok
// path: /distributions
{"xMLDistributions":{"distribution":[{"id":1,"name":"Sample Distribution 1"},{"id":2,"name":"Sample Distribution 2"}]}}
J'ai également eu à configurer .arrays("distribution")
de toujours obtenir un tableau JSON, même avec un seul élément.
Idéalement, j'aimerais avoir cette sortie:
// path: /distribution/1
{"id":1,"name":"Example Distribution"} // currently works
// path: /distributions
[{"id":1,"name":"Sample Distribution 1"},{"id":2,"name":"Sample Distribution 2"}]
J'ai essayé de retourner un List<XMLDistribution>
, XMLDistributionList
(wrapper autour d'une liste), un XMLDistribution[]
, mais je ne pouvais pas trouver un moyen d'obtenir un simple tableau JSON de distributions dans mon format requis.
J'ai aussi essayé les autres notations retourné par JSONConfiguration.natural()
, JSONConfiguration.mappedJettison()
, etc, et ne pouvait pas obtenir quelque chose ressemblant à ce que j'ai besoin.
Personne ne sait si il est possible de configurer JAXB pour ce faire?