2014-11-26 5 views
1

Я создал очень простой сервиз RESTful, используя Джерси, после этого guide. я настроил сгенерированный код образца, чтобы иметь полиморфный структуру, где животное является базовым классом и овец и коз наследовать от него:Джерси - ответ JSON пуст, если используется полиморфизм

@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, если этот вопрос s) и попытаться запросить ответ XML, например. в браузере, выход правильно так:

<sheep> 
    <fur>curly</fur> 
</sheep> 

или, если я прошу козу:

<goat> 
    <color>yellow</color> 
</goat> 

, но как только я прошу ответ JSON, вывод пустой JSON документа: {} я использую локон, чтобы получить JSON типа носителя, как это:

curl -H "Accept: application/json" http://localhost:8080/simple-service-webapp/api/animal/goat 

Что мне нужно настроить или изменить, чтобы получить ответ JSON, представляющий правильный объект? Я новичок в этой теме, я надеюсь, что вопрос ясен. Спасибо.

PS: Если возвращаемый тип метода getIt установлен, например, Объект Sheep and Sheep возвращается, ответ JSON правильный, поэтому я полагаю, что мне нужно каким-то образом нанести наследование наследование, чтобы он распознал возвращаемый тип, но я не могу узнать, что делать.

ответ

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

Это работает, спасибо, есть также способ избавиться от собственности "типа"? – martin

+0

Хм. Я даже не обращал на это внимания. Позвольте мне посмотреть на него –

+0

Я думаю, вы найдете ответ [здесь] (http://stackoverflow.com/a/14213149/2587435). Не успевайте проверить это. Но также обратите внимание, что с 'jersey-media-json-jackson' вместо MOXy вы не получите этого поведения –

Смежные вопросы