Я создал очень простой сервис RESTful, используя Джерси, следуя этому руководству. Я скорректировал сгенерированный образец кода, чтобы иметь полиморфную структуру, в которой Animal является базовым классом, а Sheep и Goat наследуют от него:
@XmlRootElement
public abstract class Animal {
public Animal() {}
}
@XmlRootElement
public class Sheep extends Animal {
public String fur;
public Sheep() {this.fur = "curly";}
}
@XmlRootElement
public class Goat extends Animal {
public String color;
public Goat() {this.color = "yellow";}
}
и следующий класс ресурсов, который дает ответ:
@Path("animal")
public class MyResource {
@GET
@Path("{animal}")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Animal getIt(@PathParam("animal") String animal) {
return (animal.equals("sheep")) ? new Sheep() : new Goat();
}
}
зависимости проекта в моем pom.xml:
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-moxy</artifactId>
</dependency>
</dependencies>
Когда я запускаю приложение в Eclipse на сервере (используя Tomcat v8.0, если это имеет значение) и попробуйте запросить ответ XML, например, в браузере, вывод будет прав следующим образом:
<sheep>
<fur>curly</fur>
</sheep>
или если я попрошу козла:
<goat>
<color>yellow</color>
</goat>
но как только я запрашиваю ответ JSON, выход представляет собой пустой документ JSON: {} Я использую curl для получения типа медиа JSON следующим образом:
curl -H "Accept: application/json" http://localhost:8080/simple-service-webapp/api/animal/goat
Что мне нужно настроить или изменить, чтобы получить ответ JSON, представляющий правильный объект? Я новичок в этой теме, я надеюсь, что вопрос ясен. Спасибо.
PS: Если возвращаемый тип метода getIt установлен, например, возвращается объект Sheep and Sheep, ответ JSON правильный, поэтому я полагаю, что мне нужно каким-то образом нанести наследование наследование, чтобы он распознал возвращаемый тип, но я не могу найти что делать.
Похоже, это требует использования @XmlSeeAlso
@XmlRootElement
@XmlSeeAlso({Sheep.class, Goat.class})
public abstract class Animal {
public Animal() {}
}
C:\>curl -H "Accept:application/json" http://localhost:8080/api/animal/sheep
{"type":"sheep","fur":"curly"}