Сериализация подклассов Джерси и Джексона не включает в себя дополнительные атрибуты - PullRequest
3 голосов
/ 16 июня 2011

В Джерси при использовании Джексона для сериализации JSON дополнительные атрибуты реализующего подкласса не включаются. Например, с учетом следующей структуры класса

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="@class")
@JsonSubTypes({
    @JsonSubTypes.Type(value = Foo.class, name = "foo")
}
public abstract class FooBase {
    private String bar;

    public String getBar() {
        return bar;
    }

    public void setBar( String bar ) {
        this.bar = bar;
    }
}

public class Foo extends FooBase {
    private String biz;

    public String getBiz() {
        return biz;
    }

    public void setBiz( String biz ) {
        this.biz = biz;
    }
}

и следующий код Джерси

@GET
public FooBase get() {
   return new Foo();
}

Я получаю обратно JSON

{"@class" => "foo", "bar" => null}

Но то, что я на самом деле хочу, это

{"@class" => "foo", "bar" => null, "biz" => null}

Кроме того, в моем файле web.xml я включил POJOMappingFeature , чтобы решить эту проблему

<init-param>
    <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
    <param-value>true</param-value>
</init-param>

Редактировать: Исправлен Java-код для правильной установки сеттеров и Foo, чтобы не быть абстрактным

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Должно работать так, как вы показываете; с одним возможным исключением: если вы включаете аннотации JAXB (только), ограничения JAXB требуют, чтобы только пары получателя / установщика использовались для обнаружения свойств. Поэтому попробуйте добавить сеттер для 'biz' и посмотрите, изменит ли это его.

Этого не произойдет с аннотациями Джексона; и в идеале нет, если вы комбинируете аннотации Джексона и JAXB (я думал, что Джерси активировал оба). Если также включена обработка аннотаций Джексона, добавление @JsonProperty рядом с getBiz также должно помочь.

Наконец, если вам не нужны аннотации JAXB, вы можете просто вернуться к использованию только аннотаций Джексона - на мой взгляд, основной сценарий использования аннотаций JAXB - это если вам нужно создать как XML, так и JSON и использовать JAXB (через Джерси) для XML. В противном случае они бесполезны с JSON.

1 голос
/ 22 июня 2011

Используя POJOMappingFeature, вы также можете аннотировать ваши классы с помощью JAXB:

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public abstract class FooBase {
    private String bar;
}

@XmlType
@XmlAccessorType(XmlAccessType.FIELD)
public class Foo extends FooBase {
    private String biz;
}
...