J'ai une classe de ressources qui tente de retourner un type d'interface, dire « Forme »:Est-ce qu'une requête Jersey GET peut renvoyer une entité polymorphe?
public interface Shape {...}
@XmlRootElement
public class Circle implements Shape {...}
@Path("/api/shapes")
public class ShapeResource {
@GET
@Path("/{shapeId}")
public Shape get(@PathParam("shapeId") String shapeId) {
....
return new Circle();
}
}
Expérimenter avec ce qui précède, je vois que le serveur retourne XML comme ceci:
<?xml version="1.0" encoding="UTF-8"?>
<circle>
...
</circle>
Jusqu'ici tout va bien. Le problème est, le client ne sait pas comment unmarshall ceci. Je reçois:
com.sun.jersey.api.client.ClientHandlerException: A message body for Java type, interface Shape, and MIME media type, application/xml, was not found
donné une WebResource, et en demandant un type d'entité de Shape.class provoque une exception.
Le serveur semble faire la bonne chose. J'ai lutté pendant des heures pour obtenir que le client désérialise cette classe. J'ai même essayé d'encapsuler l'interface que j'essaie vraiment d'obtenir dans un emballage comme indiqué ici: https://jaxb.dev.java.net/guide/Mapping_interfaces.html. Cela n'a pas fonctionné non plus.
Mon code client ressemble à ceci:
ClientResponse response = get(wr, ClientResponse.class); // wr == WebResource
try {
return response.getEntity(Shape.class); // <-- FAIL
} catch (Exception e) {
e.printStackTrace();
// com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java type, interface Shape, and MIME media type, application/xml, was not found
}
try {
return response.getEntity(Circle.class); // <-- WIN, but hacky and forces me to try every concrete type
} catch (Exception e) {}
return null;
Toute idée ou d'orientation est grandement appréciée. Merci d'avance.
Cela devrait fonctionner. Je l'ai fait assez souvent. Je pense que c'est un bug dans votre code client. Pouvez-vous l'afficher? –
J'ai mis à jour le message original – Erik
Hmm, que se passe-t-il lorsque vous ajoutez '@ XmlRootElement' à' Shape'? –