REST:如何以"浅薄"的方式将java对象序列化为JSON?

Alv*_*son 14 rest spring json jpa java-ee

假设我有以下JPA实体:

@Entity
public class Inner {
  @Id private Long id;
  private String name;

  // getters/setters
}

@Entity
public class Outer {
  @Id private Long id;
  private String name;
  @ManyToOne private Inner inner;

  // getters/setters
}
Run Code Online (Sandbox Code Playgroud)

Spring和Java EE都具有带有默认序列化器的REST实现,这些序列化器将实体与JSON进行编组,无需进一步编码.但是当转换Outer为JSON时,Spring和EE都嵌套了Inner它的完整副本:

// Outer
{
  "id": "1234",
  "name": "MyOuterName",
  "inner": {
    "id": "4321",
    "name": "MyInnerName"
  }
}
Run Code Online (Sandbox Code Playgroud)

这是正确的行为,但对我的Web服务有问题,因为对象图可以变得深/复杂并且可以包含循环引用.是否有任何方法可以配置提供的编组器以"浅"方式编组POJO /实体,而无需为每个编写器定制一个自定义JSON序列化器?一个适用于所有实体的自定义序列化程序都可以.我理想上喜欢这样的东西:

// Outer
{
  "id": "1234",
  "name": "MyOuterName",
  "innerId": "4321"
}
Run Code Online (Sandbox Code Playgroud)

我也希望它能将JSON"解组"回到等效的java对象中.如果解决方案适用于Spring和Java EE,则可获得奖励.谢谢!

Mr_*_*que -1

您可以在序列化之前分离 JPA 实体,如果使用延迟加载,则可以避免加载子对象。

另一种方式,但取决于 JSON 序列化器 API,您可以使用“瞬态”或特定注释。

为什么JPA有@Transient注解?

一个糟糕的方法是使用像 dozer 这样的工具将 JPA 对象复制到另一个类中,仅包含 json 所需的属性(但它有效......内存、CPU 和时间开销很小......)

@Entity
public class Outer {
  @Id private Long id;
  private String name;
  @ManyToOne private Inner inner;
  //load manually inner.id 
  private final Long innerId;
  // getters/setters
}
Run Code Online (Sandbox Code Playgroud)