Jersey - JSON-ответ пуст, если используется полиморфизм

1

Я создал очень простой сервис 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 правильный, поэтому я полагаю, что мне нужно каким-то образом нанести наследование наследование, чтобы он распознал возвращаемый тип, но я не могу найти что делать.

Теги:
rest
jersey
moxy

1 ответ

0
Лучший ответ

Похоже, это требует использования @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"}

  • 0
    Это работает, спасибо, есть ли способ избавиться от свойства "type"?
  • 0
    Хм. Я даже не обратил на это внимания. Позволь мне взглянуть на это
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню