У меня есть класс Resource, который пытается вернуть тип интерфейса, скажем «Shape»:
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();
}
}
Поэкспериментируя с вышесказанным, я вижу, что сервер возвращает XML примерно так:*
<?xml version="1.0" encoding="UTF-8"?>
<circle>
...
</circle>
Пока все хорошо.Проблема в том, что клиент не знает, как это разобрать.Я получаю:
com.sun.jersey.api.client.ClientHandlerException: A message body for Java type, interface Shape, and MIME media type, application/xml, was not found
Учитывая WebResource, и запрос типа сущности Shape.class вызывает исключение.
Сервер, кажется, делает правильную вещь.Я часами боролся за то, чтобы заставить клиента десериализовать этот класс.Я даже пытался обернуть интерфейс, который я действительно пытаюсь вставить в обертку, как показано здесь: https://jaxb.dev.java.net/guide/Mapping_interfaces.html. Это тоже не сработало.
Мой код клиента выглядит так:
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;
Любое понимание или руководство очень ценится.Заранее спасибо.