用JAXB转换XML和Java对象时的循环引用问题的解决方法

原创 2015年07月08日 23:13:50

    利用JAXB可以实现XML与Java对象之间的转换。在转换时,可能会遇到交叉引用的情况,如果不做处理,提示为:

    A cycle is detected in the object graph. This will cause infinitely deep XML:...

    解决办法有两种:利用com.sun.xml.bind.CycleRecoverable和org.eclipse.persistence.oxm.annotations.XmlInverseReference。

    以一个Student和SClass类为例。它们之间如果建立双向关系时会引起交叉引用。未处理前代码如下:

public class Student{
	
	private String num;
	private String name;

	private SClass sclass;


	public Student(){
		super();
	}
	
	public Student(String num, String name){
		super();
		this.num = num;
		this.name = name;
	}
	
	public SClass getSclass() {
		return sclass;
	}

	public void setSclass(SClass sclass) {
		this.sclass = sclass;
	}
	
	public String getNum(){
		return num;
	}
	
	public void setNum(String num){
		this.num = num;
	}
	
	public String getName(){
		return name;
	}
	
	public void setName(String name){
		this.name = name;
	}

}
@XmlRootElement
public class SClass{
	
	private String cnum;
	private List<Student> students;
	
	public SClass(){
		super();
	}
	
	public SClass(String cnum, List<Student> students){
		super();
		this.cnum = cnum;
		this.students = students;
	}
	
	
	public void addStudent(Student student){
		if(!this.students.contains(student)){
			student.setSclass(this);
			this.students.add(student);
		}
	}

	public String getCnum(){
		return cnum;
	}
	
	public void setCnum(String cnum){
		this.cnum = cnum;
	}
	
	public List<Student> getStudents(){
		return students;
	}
	
	public void setStudents(List<Student> students){
		this.students = students;
	}	
	
}

    1. 利用com.sun.xml.bind.CycleRecoverable。

    需要让两个类都实现接口CycleRecoverable的方法onCycleDetected。以Student为例:

public class Student implements CycleRecoverable{
	
	private String num;
	private String name;
	private SClass sclass;

        ......
	public Object onCycleDetected(Context arg0) {
		// TODO Auto-generated method stub
		Student student=new Student();
		student.setNum(this.getNum());
		
		return student;
	}
}
    当遇到循环交叉引用时,JAXB引擎会调用该方法,用return的对象来替换this。这样就可以将引起循环引用问题的关系断开,返回给JAXB。

    这种方法中,如果是使用maven,需加入依赖:

	<dependency>
		<groupId>javax.xml</groupId>
		<artifactId>jaxb-impl</artifactId>
		<version>2.1</version>
	</dependency>

    2. 利用org.eclipse.persistence.oxm.annotations.XmlInverseReference。

    该方法中,要被引用的部分使用@XmlInverseReference标注。本文例中需要在Student部分加入:

SClass:
	private List<Student> students;

Student:
	@XmlInverseReference(mappedBy="students")
	private SClass sclass;
注意:mappedBy是必须有的属性,其值为引用Student的SClass类的对应field。

特别要注意的是,使用XmlInverseReference时,需要在数据模型类(本例中是Student和SClass)所在package下加入一个jaxb.properties属性文件,里面内容是:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
    这种方法中,如果是使用maven,需加入依赖:
	<dependency>
		<groupId>org.eclipse.persistence</groupId>
		<artifactId>org.eclipse.persistence.moxy</artifactId>
		<version>2.5.0</version>
	</dependency>



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java 关于xml的注解,自动生成xml文件 - @XML***

用的是jdk自带的javax.xml.bind.JAXBContext将对象和xml字符串进行相互转换。        如果对要生成的 xml 格式有点些许的限制,就会对生成xml的对象就需要进行些许...

用jaxb通过XSD生成Java类的CDATA的处理

快花费一天的时间了,终于找到解决方法,简单记下来 1. 开始通过:http://theopentutorials.com/tutorials/java/jaxb/jaxb-marshalling-a...

jaxb 的使用介绍[转载]

什么是jaxb?http://java.sun.com/xml/jaxb/about.html主要能干什么?当人们需要用java应用程序来访问数据库的时候,jdbc诞生了当人们觉得频繁的jdbc操作很...

JAXB将JAVA对象转换为XML时CDATA的问题

对Java对象转换为xml字符串时,如果有特殊字符如<>必须要是用来声明。我先尝试了使用XStream解决这个问题也有使用MOXy CDATA注解解决,最后发现,都存在一定的缺陷,甚至不能正常的实现该...

JAXB将JAVA对象转换为XML时CDATA的问题

博客来源:http://blog.csdn.net/wantken/article/details/50675549 对Java对象转换为xml字符串时,如果有特殊字符如来声明。我先尝试了使用XSt...

玩转Java对象和XML相互转换[JAXB]

原址:http://blog.csdn.net/sd4015700/article/details/39474893 最近在项目中一直出现Java对象和XML之间的相互转换,一开始由于项目很...

利用JAXB实现java对象和xml的相互转换

一:JAXB注解  JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换。JAXB 可以实现Java对象与XML的相互转换,在JAXB中...
  • zhhpjl
  • zhhpjl
  • 2014-12-30 15:28
  • 1912

JAXB解析xml文件转换为Java对象

Marshal 和 UnMarshal的过程并不复杂,只需要从JAXBContext中获得Marshaller或Unmarshaller对象,就可以让JAXB帮我们 来进行转换

JAXB 实现java对象与xml之间互相转换

利用Marshaller和unMarshaller可在java的object对象和xml之间实现转换 首先创建一个简单的Boy对象 [java] view plaincop...

使用JAXB实现JAVA对象和XML字符串的互相转换实例

使用JAXB实现JAVA对象和XML字符串的互相转换实例,非常实用的技术。
  • 5iasp
  • 5iasp
  • 2014-08-11 15:09
  • 40469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)