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