Java 是否可以查看JAXB分析的对象图?
我有一个现有的复杂对象模型,我正试图将其转换为JAXBXML。如果可能的话,我不想更改任何现有的域类。我有一段代码正在处理,以便将其打包成一个文件(使用Groovy) 问题是对象图非常复杂,JAXB告诉我Java 是否可以查看JAXB分析的对象图?,java,groovy,jaxb,object-graph,Java,Groovy,Jaxb,Object Graph,我有一个现有的复杂对象模型,我正试图将其转换为JAXBXML。如果可能的话,我不想更改任何现有的域类。我有一段代码正在处理,以便将其打包成一个文件(使用Groovy) 问题是对象图非常复杂,JAXB告诉我com.sun.istack.internal.SAXException2:在对象图中检测到一个循环。这将导致无限深的XML:com.example。Object@1eef1eb[Id=100053900]->com.example。Object@1eef1eb[Id=100053900] 有没
com.sun.istack.internal.SAXException2:在对象图中检测到一个循环。这将导致无限深的XML:com.example。Object@1eef1eb[Id=100053900]->com.example。Object@1eef1eb[Id=100053900]
有没有办法获得更多有关检测周期的信息?有人知道有什么工具可以帮助分析图表或以图表的形式列出图表,这样我就可以找出周期了吗?我有一种感觉,在这个图表中有很多循环(它既古老又复杂),所以任何帮助都将不胜感激
或者,您可以告诉JAXB只进行“n”级或类似的操作,这样它就不会创建无限深的XML了吗
编辑:
所以关于我的具体问题。。。原来现有的域对象有一个对象getThis()
和void setThis(object obj)
方法,该方法定义为“获取”和“设置”这个自引用关键字。这就是导致我的周期的原因。这还强调了一个事实,即JAXB必须使用JavaBean方法定义来确定它将处理哪些属性(我以前不知道)
然而,我认为最初的问题仍然存在,是否有任何好的工具用于分析/查看对象图?您可以让您的对象实现cyclererecoverable
界面来查找有关周期的信息
import java.util.*;
import javax.xml.bind.annotation.*;
import com.sun.xml.bind.CycleRecoverable;
@XmlRootElement
public class Department implements CycleRecoverable {
@XmlAttribute
public int id;
public String name;
public List<Employee> employees = new ArrayList<Employee>();
public Object onCycleDetected(Context arg0) {
// Context provides access to the Marshaller being used:
System.out.println("JAXB Marshaller is: " + cycleRecoveryContext.getMarshaller());
DepartmentPointer p = new DepartmentPointer();
p.id = this.id;
return p;
}
}
import java.util.*;
导入javax.xml.bind.annotation.*;
导入com.sun.xml.bind.cyclererecoverable;
@XmlRootElement
公共类部门实现CycleRecoverable{
@XmlAttribute
公共int id;
公共字符串名称;
public List employees=new ArrayList();
一次循环检测的公共对象(上下文arg0){
//上下文提供对正在使用的封送拆收器的访问:
println(“JAXB Marshaller是:+cycleRecoveryContext.getMarshaller());
DepartmentPointer p=新的DepartmentPointer();
p、 id=this.id;
返回p;
}
}
了解更多信息
也许您可以引入一种方法来跟踪编组过程并转储对象信息,以便进行诊断。有关详细信息,请参见(引用“外部侦听器”的零件)。这不需要对现有域进行更改
import java.util.*;
import javax.xml.bind.annotation.*;
import com.sun.xml.bind.CycleRecoverable;
@XmlRootElement
public class Department implements CycleRecoverable {
@XmlAttribute
public int id;
public String name;
public List<Employee> employees = new ArrayList<Employee>();
public Object onCycleDetected(Context arg0) {
// Context provides access to the Marshaller being used:
System.out.println("JAXB Marshaller is: " + cycleRecoveryContext.getMarshaller());
DepartmentPointer p = new DepartmentPointer();
p.id = this.id;
return p;
}
}