使用JAXB的简介
我正在將一些依賴于Apache XMLBeans的模塊遷移到JAXB。 這是令人興奮且充滿挑戰(zhàn)的幾天。 我想記下我遇到的一些重要事情,以供將來可能會(huì)發(fā)現(xiàn)有用的任何人使用。
首先,讓我們來看一下設(shè)置用于JAXB代碼生成的maven插件。 在撰寫本文時(shí),我遇到了兩個(gè)Maven插件。
- http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/index.html
- https://github.com/highsource/maven-jaxb2-plugin
最后使用第一個(gè),因?yàn)槲野l(fā)現(xiàn)配置非常簡(jiǎn)單。
您的Maven項(xiàng)目結(jié)構(gòu)如下:
項(xiàng)目文件夾-> src-> main-> xsd
這將保存您要從中生成JAXB對(duì)象的所有XSD文件。
項(xiàng)目文件夾-> src-> main-> xjb
這將保留您的“ bindings.xml”文件,該文件是您的數(shù)據(jù)綁定文件,用于運(yùn)行JAX生成任務(wù)(xjc)時(shí)需要進(jìn)行的任何自定義。
maven的插件配置如下所示;
<plugin><groupId>org.codehaus.mojo</groupId><artifactId>jaxb2-maven-plugin</artifactId><version>2.2</version><executions><execution><id>xjc</id><goals><goal>xjc</goal></goals></execution></executions><configuration><target>2.1</target><sources><source>src/main/xsd</source></sources></configuration></plugin>- 與XMLBeans一起使用的一件事是所有可選元素的“ isSet”類型的方法,這些方法將檢查是否設(shè)置了該元素。 默認(rèn)情況下,JAXB不會(huì)生成此方法,因此您必須在每個(gè)元素上使用not null條件。 幸運(yùn)的是,綁定配置允許以下操作:
- 默認(rèn)情況下,JAXB不會(huì)為XSD文件上定義的枚舉生成Java枚舉。 可悲的是,我找不到在全球范圍內(nèi)應(yīng)用這一代的方法,只能按XSD處理它。 但是對(duì)于XMLBeans,這是自動(dòng)完成的。 為了生成Java枚舉,應(yīng)該執(zhí)行以下操作:
樣本XSD:
<xs:complexType name="EndpointType"><xs:attribute name="protocol"><xs:simpleType><xs:restriction base="xs:string"><xs:enumeration value="HTTP"/><xs:enumeration value="HTTPS"/><xs:enumeration value="PAYLOAD"/></xs:restriction></xs:simpleType></xs:attribute></xs:complexType>JAXB綁定:
<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"xmlns:jxb="http://java.sun.com/xml/ns/jaxb"xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"jxb:extensionBindingPrefixes="xjc"version="2.1"> <jxb:bindings schemaLocation="../xsd/testconfig.xsd"><jxb:bindings node="//xs:complexType[@name='EndpointType']/xs:attribute[@name='protocol']/xs:simpleType"><jxb:typesafeEnumClass name="Protocol" /></jxb:bindings></jxb:bindings> </jxb:bindings>schemaLocation –這是我要引用的XSD的相對(duì)路徑。 由于我的“ bindings.xml”位于“ xjb”目錄中,因此我不得不向上移動(dòng)一步,進(jìn)入XSD目錄,以獲取所需的XSD文件。
節(jié)點(diǎn) –在這里,您需要提供定義了枚舉的簡(jiǎn)單類型的xquery路徑。 如果將其與提供的XSD進(jìn)行交叉檢查,您將了解XQuery路徑如何檢索給定元素。
注意 :無論如何,如果您的xpath返回多個(gè)具有相同名稱的元素,您仍然可以通過在<jxb:bindings>元素上引入元素multiple =“ true”來處理此問題。
例如:<jxb:bindings node =” // xs:complexType [@ name ='EndpointType'] / xs:attribute [@ name ='protocol'] / xs:simpleType”
多個(gè)=“ true” >
typesafeEnumClass –在此元素上,您可以提供要生成的Java枚舉名稱。
- 默認(rèn)情況下,XMLBeans將所有XSD日期和日期時(shí)間元素轉(zhuǎn)換為Java Calendar對(duì)象。 但是,對(duì)于JAXB,默認(rèn)情況下使用XMLGregorianCalendar 。 全局綁定再次得以解決,并通過以下配置處理了該配置,該配置將所有XSD日期元素轉(zhuǎn)換為Java Calendar對(duì)象。
- 如果需要使您的JAXB對(duì)象可序列化,則可以使用以下全局綁定配置來實(shí)現(xiàn):
達(dá)到目的的元素是“ <xjc:serializable />”元素。
- 在JDK 1.8中,我遇到了一個(gè)問題,即如果您的XSD中有一個(gè)導(dǎo)入了另一個(gè)架構(gòu)以通過HTTP檢索另一個(gè)XSD,則該問題被阻止了。 拋出錯(cuò)誤的摘錄是“因?yàn)橛捎赼ccessExternalDTD屬性設(shè)置的限制而不允許'http'訪問” 。 在這種情況下,解決方法是使用以下maven插件設(shè)置繞過此限制所需的VM參數(shù)。 有關(guān)此問題的更多信息,請(qǐng)參見此處 。
就是這樣。 我會(huì)繼續(xù)更新這篇文章。 與往常一樣,您對(duì)此的反饋總是非常感激。
謝謝您的閱讀,祝大家有美好的一天。
翻譯自: https://www.javacodegeeks.com/2016/08/introduction-working-jaxb.html
總結(jié)
- 上一篇: 谷歌guava_Google Guava
- 下一篇: 360软件电脑管家(电脑下载360软件管