Java 复合关系将父引用分配给子/反序列化

Java 复合关系将父引用分配给子/反序列化,java,json,oop,jackson,jackson-databind,Java,Json,Oop,Jackson,Jackson Databind,我有一门课,像: @Setter @Getter public class Parent { private String name; private String lastName; private String address; @Setter(AccessLevel.PRIVATE) @JsonBackReference private Child child; public Parent() { this.chi

我有一门课,像:

@Setter
@Getter
public class Parent {
    private String name;
    private String lastName;
    private String address;

    @Setter(AccessLevel.PRIVATE)
    @JsonBackReference
    private Child child;

    public Parent() {
        this.child = new Child();
        child.setParent(this);
    }
}
和一个复合关系中的孩子,如:

@Setter
@Getter
public class Child {
    private String nameChild;
    private String lastNameChild;

    @JsonManagedReference
    private Parent parent;
}
我想要的是:

导入com.fasterxml.jackson.core.JsonProcessingException

import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;

public class Example {
    @Test
    public void Test() throws JsonProcessingException {
        Parent parent = new Parent();
        parent.setAddress("Address");
        parent.setLastName("LastName");
        parent.setName("Name");

        parent.getChild().setNameChild("ChildName");
        parent.getChild().setLastNameChild("ChildLastName");

        Parent referenceToParent = parent.getChild().getParent();

        ObjectMapper objMapper = new ObjectMapper();
        String json = objMapper.writeValueAsString(referenceToParent);

        Parent m = objMapper.readValue(json, Parent.class);
    }
}
我想在引用中从复合关系中的子对象复制对父对象的引用

  • 我如何构造我的对象
  • 如何处理子->父字段进行反序列化
  • 反序列化的结果通知子元素不存在,这不是预期的行为:

    {"name":"Name","lastName":"LastName","address":"Address"}
    

    您可以覆盖生成的Setter方法
    setChild
    setParent
    ,如下所示

    //父类
    公共无效集合子对象(子对象){
    这个孩子=孩子;
    如果(child.getParent()==null){//防止StackOverflowException
    child.setParent(this);
    }
    }
    //儿童班
    公共void setParent(父级){
    this.parent=parent;
    如果(parent.getChild()==null){//防止StackOverflowException
    parent.setChild(this);
    }
    }
    @试验
    公开无效测试(){
    父项=新父项();
    母公司地址(“地址”);
    parent.setLastName(“LastName”);
    父集合名(“名称”);
    子项=新子项();
    child.setNameChild(“ChildName”);
    child.setLastNameChild(“ChildLastName”);
    parent.setChild(child);
    assertNotNull(parent.getChild().getParent());
    }
    
    调用父.getChild().setLastNameChild(“ChildLastName”)时出现的问题表示此时没有子级。因此,要么在
    父对象的构造函数中创建一个始终是
    子对象
    ,要么像我那样传递
    子对象

    ---编辑

    如果我理解您的评论是正确的,那么您可以选择以下选项来防止手动实例化

    @Setter
    @吸气剂
    公共类父级实现可序列化{
    私有字符串名称;
    私有字符串lastName;
    私有字符串地址;
    @Setter(AccessLevel.PRIVATE)
    独生子女;
    公共家长(){
    this.child=新的child();
    child.setParent(this);
    }
    }
    
    @测试
    公开无效测试(){
    父项=新父项();
    母公司地址(“地址”);
    parent.setLastName(“LastName”);
    父集合名(“名称”);
    parent.getChild().setNameChild(“ChildName”);
    parent.getChild().setLastNameChild(“ChildLastName”);
    assertNotNull(parent.getChild().getParent());
    }
    
    private
    setChild()
    方法防止重写子级。如果要手动设置子对象,则必须将这两种方法结合起来


    公共
    setParent()
    可能很关键,因为可以覆盖相关的父项。

    在您的
    parent
    子项
    setter中,让
    parent
    子项的父项设置为自身。谢谢,Johnathan,请您编写一段代码,我将不胜感激。C#还是Java?您已经添加了两个标记。c#或Java,没有问题。我不想从我的测试中手动创建子对象,例如,在反序列化的情况下,复合关系父-子对象应该自动发生。感谢您的帮助,是否有可能自动进行赋值?我的意思是,例如在反序列化的情况下,应该自动创建关系。问题发生在反序列化时。如果按原样序列化对象,将创建堆栈溢出。正如我们所说的,子类中的parent字段将引用parent。我需要反序列化,并在Child中自动填充Parent字段。然后你可以编辑你的初始问题,因为我不知道反序列化是什么意思,因为你的问题中没有提到它。让类实现接口
    java.io.Serializable
    。这是由你实际使用JSON的编辑引起的杰克逊:内容完全改变了。下次你提问时,请提供所有必要的细节。在这种情况下,我建议问一个新问题,并提供所有细节。