Java Jackson使用基于Spring引导深度的序列化

Java Jackson使用基于Spring引导深度的序列化,java,spring-mvc,spring-boot,jackson,spring-data-jpa,Java,Spring Mvc,Spring Boot,Jackson,Spring Data Jpa,在我们的spring boot(1.5.6)应用程序中,我们的实体中有一个经典的双向单域层次结构,例如,顺序有许多项 public class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; @OneToMany(mappedBy = "order", ) @JsonManagedReference private Set<Item&

在我们的spring boot(1.5.6)应用程序中,我们的实体中有一个经典的双向单域层次结构,例如,
顺序
有许多

public class Order {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @OneToMany(mappedBy = "order", )
    @JsonManagedReference
    private Set<Item> items = new HashSet<>();
    // getters and setters

} 

public class Item {

   @Id
   @GeneratedValue(strategy = GenerationType.AUTO)
   private Long id;

   @ManyToOne
   @JsonBackReference
    private Order order = new HashSet<>();
    // getters and setters

} 
公共类秩序{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@OneToMany(mappedBy=“order”,)
@JsonManagedReference
private Set items=new HashSet();
//接球手和接球手
} 
公共类项目{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私人长id;
@许多酮
@JsonBackReference
private Order=new HashSet();
//接球手和接球手
} 
在使用rest控制器获取数据的JavaScript视图中,有时
顺序
,有时
是根对象。假设我们有某种“显示顺序”和另一个“显示项目”视图

因此,如果
Order
是根,我们还想知道它的子项(items),如果
Item
是根,我们还想知道它的父项顺序

序列化显然会生成无限递归,因此我们通常在这里使用
@JsonManagedReference
@JsonBackReference
。 但是,这会删除back引用(因此我们这里有一个单向序列化…)。我们还尝试使用
JsonIdentityInfo
——这不起作用,因为elasticsearch在反序列化过程中存在一些问题,我们还有一些交叉引用,这些交叉引用也将被ID取代,并将一切搞砸

长话短说,我们现在的想法是进行某种“深度突破”:

  • 当第一个序列化对象是
    订单
    ,则其
    -属性应完全序列化。但是对于每个
    项目
    ,对
    订单
    的反向引用不应序列化(这里可以说“订单深度为2”)
  • 当第一个序列化对象是
    时,将序列化其反向引用
    顺序
    ,但将忽略对项的第二个托管引用
我们也为此尝试了JsonView,但无法动态设置此值


任何人如果解决了这个问题,或者有一种方法我们可以使用它?

而不是
@JsonManagedReference
@JsonBackReference
您可以使用
@JsonIgnoreProperties
注释来抑制嵌套属性的序列化:

public class Item {

   //...

   @JsonIgnoreProperties("items") 
   @ManyToOne
   private Order order = new HashSet<>();

   //...
} 
公共类项目{
//...
@JsonIgnoreProperties(“项目”)
@许多酮
private Order=new HashSet();
//...
} 

哦,见鬼-那很简单-我不知道这件事。。。谢谢这太完美了。从未来开始谢谢你