我遇到了在JAXB中使用自引用类进行向下转换的问题。
我的设置:
@XmlRootElement
class IdentifiableObject {
@XmlID
@XmlAttribute
String id;
@XmlAttribute
String name;
}
@XmlRootElement
class Node extends IdentifiableObject {
@XmlElement
@XmlJavaAdapter(SimpleAdapterThatJustDowncastsToIdentifiableObject.class)
Node parent;
@XmlElement
String aField;
}
我用很多其他对象完成了这个,它运行正常。但是当我使用引用自身的类时,它不起作用。
我有什么办法可以解决这个问题吗?我知道使用XmlID / XmlIDREF有点解决问题,但我真的想要的不仅仅是一个简单的引用(我希望id 和名称来自可识别的)
澄清一下,这就是我得到的:
<nodes>
<node id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1">
<aField>This is Node 1</aField>
</node>
<node id="0a1d1895-49e1-4079-abc1-749c304cc5a2" name="Node 2">
<parent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="node" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1">
<aField>This is Node 1</aField>
</parent>
<aField>This is Node 2</aField>
</node>
</nodes>
这就是我想要的:
<nodes>
<node id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1">
<aField>This is Node 1</aField>
</node>
<node id="0a1d1895-49e1-4079-abc1-749c304cc5a2" name="Node 2">
<parent id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5" name="Node 1"/>
<aField>This is Node 2</aField>
</node>
</nodes>
更新:这里只是一个注释,schemagen实际上做了正确的事情。所以它可能是JAXB RI中的一个错误。
此致 的Morten
答案 0 :(得分:1)
您的用例不需要XmlAdapter
。您可以使用IdentifiableObject
标记@XmlTransient
类来解决问题:
<强>节点强>
package forum8257098;
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Nodes {
@XmlElement(name="node")
private List<Node> nodes;
}
<强>节点强>
package forum8257098;
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Node extends IdentifiableObject {
@XmlElement
private Node parent;
@XmlElement
private String aField;
}
<强> IdentifiableObject 强>
package forum8257098;
import javax.xml.bind.annotation.*;
@XmlTransient
public class IdentifiableObject {
@XmlID
@XmlAttribute
private String id;
@XmlAttribute
private String name;
}
<强>演示强>
package forum8257098;
import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Nodes.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum8257098/input.xml");
Nodes nodes = (Nodes) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(nodes, System.out);
}
}
<强>输入/输出强>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<nodes>
<node name="Node 1" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5">
<aField>This is Node 1</aField>
</node>
<node name="Node 2" id="0a1d1895-49e1-4079-abc1-749c304cc5a2">
<parent name="Node 1" id="49ad1cb6-f6fe-47f9-a544-4a1c6337c4a5"/>
<aField>This is Node 2</aField>
</node>
</nodes>
了解更多信息