簡體   English   中英

Jaxb implClass規范被rootElement忽略

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM