[英]Jaxb implClass specification ignored for rootElement
我正在嘗試為XSD-Type指定一個實現類。 這是一個最小的示例架構:
<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"
如果為元素而不是complexType指定implClass,則得到相同的結果。
為什么將implClass忽略為根元素? 任何想法和提示表示贊賞!
擴展以闡明我的意圖:
我不想引用現有的,帶有jaxb注釋的類,但可以使用自動生成的DocumentType-Class作為具有附加屬性和方法的引出基類。 為了以后直接編組回XML,我必須保持與XSD-Type的關系。 因此,根據我所知,implClass指令實際上是檢測類型類的jaxb生成的適當方法。
它對於內部元素(文檔標簽內標題為“ testElement”的“ element”)非常有效! 不幸的是,解組器沒有使用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(如果已指定)是className的實現類的名稱,並且必須包含完整的程序包名稱。 請注意,此自定義僅影響className的工廠方法的返回值。 當使用new創建基於架構的Value類的實例時,將忽略此自定義。
•ref(如果已指定)是在模式編譯器之外提供的值類的名稱。 這種定制使模式編譯器引用此外部類,而不是生成定義。 它必須包含完整的軟件包名稱。 該屬性與className屬性和implClass屬性互斥。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.