gpt4 book ai didi

java - rootElement 忽略 Jaxb implClass 规范

转载 作者:太空宇宙 更新时间:2023-11-04 14:13:02 24 4
gpt4 key购买 nike

我正在尝试为 XSD 类型指定一个实现类。这是一个最小的示例架构:

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="rd.test" 
xmlns:tns="rd.test" elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0">
<complexType name="DocumentType">
<annotation>
<appinfo>
<jaxb:class implClass="rd.DocumentEx" />
</appinfo>
</annotation>
<sequence>
<element name="element" type="tns:DocumentType" />
</sequence>
<attribute name="title" type="string" />
</complexType>
<element name="document" type="tns:DocumentType"/>
</schema>

我现在使用 Java JDK (1.7) 中的标准 xjc-tool(但我也使用 maven-jaxb2-plugin 进行了测试,结果相同)。

为了进行简短测试,我使用了以下 XML 文档:

<?xml version='1.0' standalone='yes' ?>
<document title="testDocument">
<element title="testElement" />
</document>

当我运行以下测试程序时,顶级文档元素 (testDocument) 和所包含的子元素 (testElement) 的结果有所不同。根的类型为“DocumentType”,即忽略指定的 implClass 指令,而元素的类型为“DocumentEx”,这是预期的结果。在生成的 ObjectFactory 中,适当的实例化似乎是正确的,但它似乎未用于 rootElement:

  public DocumentType createDocumentType() {
return new DocumentEx();
}

这是测试程序:

InputStream inp=new FileInputStream(new File("test.xml"));
JAXBContext jaxbContext = JAXBContext.newInstance("test.rd");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();

JAXBElement el = (JAXBElement)unmarshaller.unmarshal(inp);
Object obj = el.getValue();
System.out.println("doc: " + obj);
// result: "doc: test.rd.DocumentType@d1c5bb0"

DocumentType doc = (DocumentType)obj;
Object obj2=doc.getElement();
System.out.println("obj2: " + obj2);
// result: "obj2: rd.DocumentEx@d1c5bb0"

如果我为元素指定 implClass 而不是复杂类型,我会得到相同的结果。

为什么根元素的 implClass 被忽略?任何想法和提示表示赞赏!

<小时/>

澄清我的意图的扩展:

我不想引用现有的、带有 jaxb 注释的类,而是使用自动生成的 DocumentType-Class 作为具有附加属性和方法的扩展的基类。为了以后直接编码回 XML,我必须保留与 XSD 类型的关系。因此, implClass 指令实际上是检测类型类的 jaxb 生成的适当方法(据我所知)。

它对于内部元素(文档标签内标题为“testElement”的“元素”)运行得非常好!不幸的是,解码器不使用 implClass 指定的类来正确实例化根元素。请参阅上面程序摘录中的结果注释(doc 与 obj2)。

最佳答案

对于您正在寻找的行为,我相信您想要指定 ref 而不是 impl:

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="rd.test"
xmlns:tns="rd.test" elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0">
<complexType name="DocumentType">
<annotation>
<appinfo>
<jaxb:class ref="rd.DocumentEx" />
</appinfo>
</annotation>
<sequence>
<element name="element" type="tns:DocumentType" />
</sequence>
<attribute name="title" type="string" />
</complexType>
<element name="document" type="tns:DocumentType"/>
</schema>

这告诉 JAXB 使用 rd.DocumentEx 类作为 DocumentType 复杂类型。现在,尚未创建 DocumentType 类,并且 ObjectFactory 上的 createDocument 方法如下所示:

@XmlElementDecl(namespace = "rd.test", name = "document")
public JAXBElement<DocumentEx> createDocument(DocumentEx value) {
return new JAXBElement<DocumentEx>(_Document_QNAME, DocumentEx.class, null, value);
}

来自 JAXB 2.2 规范第 7.7.1 节:

• implClass if specified, is the name of the implementation class forclassName and must include the complete package name. Note that thiscustomization only impacts the return value for className’s factorymethod. This customization is ignored when new is used to createinstances of a schema-derived Value class.

• ref if specified, is thename of the value class that is provided outside the schema compiler.This customization causes a schema compiler to refer to this externalclass, as opposed to generate a definition. It must include thecomplete package name. This attribute is mutually exclusive with theclassName attribute and the implClass attribute.

关于java - rootElement 忽略 Jaxb implClass 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28064667/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com