使用 Jackson PTH 和 Spring Data MongoDB DBRef 生成额外目标属性的 Java 到 JSON 序列化

Posted

技术标签:

【中文标题】使用 Jackson PTH 和 Spring Data MongoDB DBRef 生成额外目标属性的 Java 到 JSON 序列化【英文标题】:Java to JSON serialization with Jackson PTH and Spring Data MongoDB DBRef generates extra target property 【发布时间】:2018-07-23 16:13:34 【问题描述】:

当从 Java 序列化为 JSON 时,Jackson 在使用 Spring Data MongoDB @DBRef 注释和延迟加载和 Jackson 的多态类型处理时为引用的实体生成一个额外的 target 属性。为什么会出现这种情况,是否可以省略额外的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"
          
        
      ]
    
  ]

【问题讨论】:

athlan.pl/spring-data-mongodb-remove-_class-define-explicitly 【参考方案1】:

Target 字段是由 Spring Data 添加的,因为它是一个惰性集合。所以它就像 Hibernate for JPA 中的数据处理程序等。

选项1: 要忽略它们,您只需在类级别添加 @JsonIgnoreProperties(value = "target" )

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

选项2: 让 Collection 不偷懒

【讨论】:

以上是关于使用 Jackson PTH 和 Spring Data MongoDB DBRef 生成额外目标属性的 Java 到 JSON 序列化的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot 使用啥版本的 Jackson?

使用 Spring Boot 和 Jackson 的日期时区

使用 Spring Boot 和 Jackson 避免两个不同的域模型

如何在 Spring 中捕获大量 Jackson 异常?

使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

Spring Boot Jackson 和数据序列化