Tengo una clase de recurso que intenta devolver un tipo de interfaz, dicen "Shape":¿Puede una solicitud GET de Jersey devolver una entidad polimórfica?
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();
}
}
Experimentando con lo anterior, veo que el servidor está volviendo XML, así:
<?xml version="1.0" encoding="UTF-8"?>
<circle>
...
</circle>
Hasta ahora todo bien. El problema es que el cliente no sabe cómo deshacer esto. Estoy recibiendo:
com.sun.jersey.api.client.ClientHandlerException: A message body for Java type, interface Shape, and MIME media type, application/xml, was not found
dado un WebResource, y pidiendo un tipo de entidad de Shape.class produce una excepción.
Parece que el servidor está haciendo lo correcto. He estado luchando durante horas sobre cómo lograr que el Cliente deserialice esta clase. Incluso traté de envolver la interfaz. Estoy tratando de ponerme en un contenedor como se describe aquí: https://jaxb.dev.java.net/guide/Mapping_interfaces.html. Eso tampoco funcionó.
Mi código de cliente es el siguiente:
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;
Cualquier idea o guía es muy apreciada. Gracias de antemano.
Esto debería funcionar. Lo he hecho con la suficiente frecuencia. Creo que es un error en tu código de cliente. ¿Puedes publicarlo? –
He actualizado la publicación original – Erik
Hmm, ¿qué sucede cuando agrega '@ XmlRootElement' a' Shape'? –