[英]JAXB abstract class and XmlID / XmlIDREF
好。 我是JAXB的新手,我的ID在抽象类中的XmlID和XmlIDREF遇到了一些麻烦。
这是我的问题:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso(EntityImpl.class)
public abstract class AbstractEntity {
@XmlID
private String id;
public AbstractEntity() {
this.id = generateStringId();
}
private static String generateStringId() {
return "urn:uuid:" + UUID.randomUUID().toString();
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class EntityImpl extends AbstractEntity {
private String variabel_l = "1";
private String variabel_2 = "2";
private String variabel_3 = "3";
private String variabel_4 = "4";
}
此类包含一个AbstractEntity,在本示例中为String。
@XmlAccessorType(XmlAccessType.FIELD)
public class SomeClass {
@XmlIDREF
private AbstractEntity ae;
private String status;
private SomeClass() {
}
public SomeClass(AbstractEntity ae, String status) {
this.ae= ae;
this.status = status;
}
}
此类包含两个列表,一个列表包含“ SomeClass”的实例,一个列表包含“ EntityImpl”的实例
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class Root {
@XmlElementWrapper
@XmlElement(name = "result")
private List<SomeClass> someClassList = new ArrayList<>();
@XmlElementWrapper
@XmlElement(name = "entityImpl")
private List<EntityImpl> entityImplList = new ArrayList<>();
public void addResult(SomeClass someClass) {
this.someClassList.add(someClass);
}
public void addEntityImpl(EntityImpl EntityImpl) {
this.entityImplList.add(EntityImpl);
}
将impl添加到res,并且将res和impl都添加到其在root上的相应列表。
public static void main(String[] args) throws JAXBException {
Root root = new Root();
EntityImpl impl = new EntityImpl();
SomeClass res = new SomeClass(impl, "something");
root.addEntityImpl(impl);
root.addResult(res);
JAXBContext JAXB_CONTEXT;
JAXB_CONTEXT = JAXBContext.newInstance(Root.class);
StringWriter writer = new StringWriter();
JAXB_CONTEXT.createMarshaller().marshal(root, writer);
System.out.println(writer.getBuffer().toString());
}
我想要的结果是对SomeClass实体中的impl的ID的引用,但是结果是这样的:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<someClassList>
<result>
<ae xsi:type="entityImpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>urn:uuid:b8a4c0e4-330d-4ed7-9b68-1517d2eb4c2a</id>
<variabel_l>1</variabel_l>
<variabel_2>2</variabel_2>
<variabel_3>3</variabel_3>
<variabel_4>4</variabel_4>
<variabel_5>5</variabel_5>
</ae>
<status>something</status>
</result>
</someClassList>
<entityImplList>
<entityImpl>
<id>urn:uuid:b8a4c0e4-330d-4ed7-9b68-1517d2eb4c2a</id>
<variabel_l>1</variabel_l>
<variabel_2>2</variabel_2>
<variabel_3>3</variabel_3>
<variabel_4>4</variabel_4>
<variabel_5>5</variabel_5>
</entityImpl>
</entityImplList>
</root>
如果我将@XmlIDREF移到根实体中的entityImplList,则引用工作正常,我得到以下信息:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<someClassList>
<result>
<ae xsi:type="entityImpl" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<id>urn:uuid:46d0681f-4ec6-49ac-8c22-4954eaa5c680</id>
<variabel_l>1</variabel_l>
<variabel_2>2</variabel_2>
<variabel_3>3</variabel_3>
<variabel_4>4</variabel_4>
<variabel_5>5</variabel_5>
</ae>
<status>something</status>
</result>
</someClassList>
<entityImplList>
<entityImpl>urn:uuid:46d0681f-4ec6-49ac-8c22-4954eaa5c680</entityImpl>
</entityImplList>
</root>
当REF位于“ SomeClass”中时,是否可以使XmlID / XmlIDREF正常工作?
有任何想法吗?
当我完全按照问题的要求运行代码时,我得到以下信息,这不是输出的结果吗?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<someClassList>
<result>
<ae>urn:uuid:b34f3b9e-1086-4dfc-852f-4bc55b5d5a6e</ae>
<status>something</status>
</result>
</someClassList>
<entityImplList>
<entityImpl>
<id>urn:uuid:b34f3b9e-1086-4dfc-852f-4bc55b5d5a6e</id>
<variabel_l>1</variabel_l>
<variabel_2>2</variabel_2>
<variabel_3>3</variabel_3>
<variabel_4>4</variabel_4>
</entityImpl>
</entityImplList>
</root>
UPDATE
根据我本人和ØrjanJohansen的调查,在Windows的JDK 1.7.0_21中包含的JAXB的实现中似乎与此使用案例有关。 该用例在Mac的JDK 1.7.0_21和Windows的jdk1.6.0_45中正常工作。 当将EclipseLink MOXy用作JAXB(JSR-222)提供程序时,该用例也可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.