2016-12-11 11 views
1

У меня есть этот абстрактный класс, который предоставляет некоторые общие свойства моим объектам. Ниже приводится выдержка:Как создать виртуальное свойство JSON при сериализации?

@MappedSuperclass 
public class AbstractEntity implements Serializable { 
    @Id 
    @GeneratedValue 
    private long id; 

    @Temporal(value = TemporalType.TIMESTAMP) 
    @JsonProperty(access = Access.READ_ONLY) 
    private Date createdOn; 

    @Temporal(value = TemporalType.TIMESTAMP) 
    @JsonProperty(access = Access.READ_ONLY) 
    private Date modifiedOn; 

    ⋮ 
} 

При сериализации подкласса JSON я получить ожидаемые результаты, например, это отрывок из сериализации:

{ 
    "createdOn": "2016-12-11T15:35:23Z", 
    "modifiedOn": "2016-12-11T15:35:23Z", 
    ⋮ 
} 

Мне нужно, чтобы эти общие свойства сериализованные на объект JSON таким образом, что в приведенном выше примере выглядит следующим образом:

{ 
    "_metadata": { 
    "createdOn": "2016-12-11T15:35:23Z", 
    "modifiedOn": "2016-12-11T15:35:23Z", 
    } 
    ⋮ 
} 

Я уже пробовал использовать класс под названием Metadata и имеющий свойство этот тип работает хорошо. Но мне интересно, есть ли более простой или простой способ использовать аннотации Джексона?

+0

Это, возможно, дублированный вопрос. Смотрите: [http://stackoverflow.com/questions/19158345/custom-json-deserialization-with-jackson](http://stackoverflow.com/questions/19158345/custom-json-deserialization-with-jackson) –

ответ

0

Вы можете создать класс JPA @Embeddable, и вы должны получить желаемый результат. Не уверен, что может быть проще.

Встраиваемый:

@Embeddable 
public class MetaData{ 

    @Temporal(value = TemporalType.TIMESTAMP) 
    @JsonProperty(access = Access.READ_ONLY) 
    private Date createdOn; 

    @Temporal(value = TemporalType.TIMESTAMP) 
    @JsonProperty(access = Access.READ_ONLY) 
    private Date modifiedOn; 
} 

Entity:

@MappedSuperclass 
public class AbstractEntity implements Serializable { 
    @Id 
    @GeneratedValue 
    private long id; 

    @Embedded 
    private Metadata metdata; 
} 
+0

Это это решение, которое я пробовал и действительно работает. Проблема заключается в том, что по умолчанию Spring REST не включает в себя 'id' в сериализации JSON, и я хотел бы включить его в объект метаданных. Я мог бы передать его по конструктору, но затем я дублирую данные, которые не являются изящными (между прочим). –