Сериализация Java в JSON с помощью Jackson PTH и Spring Data MongoDB DBRef создает дополнительное целевое свойство

При сериализации из Java в JSON Джексон создает дополнительное свойство target для объектов, на которые ссылаются, при использовании аннотации Spring Data MongoDB @DBRef с отложенной загрузкой и полиморфной обработкой типов Джексона. Почему это происходит, и можно ли опустить дополнительное свойство target?

Пример кода

@Document(collection = "cdBox")
public class CDBox {
  @Id
  public String id;

  @DBRef(lazy = true)
  public List<Product> products;
}

@Document(collection = "album")
public class Album extends Product {
  @DBRef(lazy = true)
  public List<Song> songs;
}

@Document(collection = "single")
public class Single extends Product {
  @DBRef(lazy = true)
  public List<Song> songs;
}

@Document(collection = "song")
public class Song {
  @Id
  public String id;

  public String title;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,
                    property = "productType",
                    include = JsonTypeInfo.As.EXTERNAL_PROPERTY)
@JsonSubTypes(value = {
    @JsonSubTypes.Type(value = Single.class),
    @JsonSubTypes.Type(value = Album.class)
})
public abstract class Product {
  @Id
  public String id;
}

Сгенерированный JSON

{
  "id": "someId1",
  "products": [
    {
      "id": "someId2",
      "songs": [
        {
        "id": "someId3",
        "title": "Some title",
        "target": {
          "id": "someId3",
          "title": "Some title"
          }
        }
      ]
    }
  ]
}

person Community    schedule 13.02.2018    source источник
comment
athlan.pl/spring-data-mongodb-remove-_class-define -явно   -  person Hannes    schedule 13.02.2018


Ответы (1)


Поле Target добавляется Spring Data, потому что это ленивая коллекция. Так что это похоже на обработчик данных и т. Д. В Hibernate для JPA.

Вариант 1: чтобы игнорировать их, вам просто нужно добавить @JsonIgnoreProperties (value = { "target" }) на уровне класса.

@Document(collection = "song")
@JsonIgnoreProperties(value = { "target" })
public class Song {
 ...
}

Вариант 2: Сделать Сбор не ленивым

person Franz Goerke    schedule 13.02.2018