日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用JAXB的简介

發布時間:2023/12/3 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用JAXB的简介 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我正在將一些依賴于Apache XMLBeans的模塊遷移到JAXB。 這是令人興奮且充滿挑戰的幾天。 我想記下我遇到的一些重要事情,以供將來可能會發現有用的任何人使用。

首先,讓我們來看一下設置用于JAXB代碼生成的maven插件。 在撰寫本文時,我遇到了兩個Maven插件。

  • http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/index.html
  • https://github.com/highsource/maven-jaxb2-plugin

最后使用第一個,因為我發現配置非常簡單。

您的Maven項目結構如下:

項目文件夾-> src-> main-> xsd

這將保存您要從中生成JAXB對象的所有XSD文件。

項目文件夾-> src-> main-> xjb

這將保留您的“ bindings.xml”文件,該文件是您的數據綁定文件,用于運行JAX生成任務(xjc)時需要進行的任何自定義。

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”類型的方法,這些方法將檢查是否設置了該元素。 默認情況下,JAXB不會生成此方法,因此您必須在每個元素上使用not null條件。 幸運的是,綁定配置允許以下操作:
<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:globalBindings generateIsSetMethod="true" </jxb:globalBindings> </jxb:bindings>
  • 默認情況下,JAXB不會為XSD文件上定義的枚舉生成Java枚舉。 可悲的是,我找不到在全球范圍內應用這一代的方法,只能按XSD處理它。 但是對于XMLBeans,這是自動完成的。 為了生成Java枚舉,應該執行以下操作:

樣本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的相對路徑。 由于我的“ bindings.xml”位于“ xjb”目錄中,因此我不得不向上移動一步,進入XSD目錄,以獲取所需的XSD文件。

節點 –在這里,您需要提供定義了枚舉的簡單類型的xquery路徑。 如果將其與提供的XSD進行交叉檢查,您將了解XQuery路徑如何檢索給定元素。

注意 :無論如何,如果您的xpath返回多個具有相同名稱的元素,您仍然可以通過在<jxb:bindings>元素上引入元素multiple =“ true”來處理此問題。

例如:<jxb:bindings node =” // xs:complexType [@ name ='EndpointType'] / xs:attribute [@ name ='protocol'] / xs:simpleType”
多個=“ true” >

typesafeEnumClass –在此元素上,您可以提供要生成的Java枚舉名稱。

  • 默認情況下,XMLBeans將所有XSD日期和日期時間元素轉換為Java Calendar對象。 但是,對于JAXB,默認情況下使用XMLGregorianCalendar 。 全局綁定再次得以解決,并通過以下配置處理了該配置,該配置將所有XSD日期元素轉換為Java Calendar對象。
<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:globalBindings><jxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/><jxb:javaType name="java.util.Calendar" xmlType="xs:date"parseMethod="javax.xml.bind.DatatypeConverter.parseDate"printMethod="javax.xml.bind.DatatypeConverter.printDate"/><jxb:javaType name="java.util.Calendar" xmlType="xs:time"parseMethod="javax.xml.bind.DatatypeConverter.parseTime"printMethod="javax.xml.bind.DatatypeConverter.printTime"/></jxb:globalBindings></jxb:bindings>
  • 如果需要使您的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:globalBindings ><xjc:serializable /></jxb:globalBindings></jxb:bindings>

達到目的的元素是“ <xjc:serializable />”元素。

  • 在JDK 1.8中,我遇到了一個問題,即如果您的XSD中有一個導入了另一個架構以通過HTTP檢索另一個XSD,則該問題被阻止了。 拋出錯誤的摘錄是“因為由于accessExternalDTD屬性設置的限制而不允許'http'訪問” 。 在這種情況下,解決方法是使用以下maven插件設置繞過此限制所需的VM參數。 有關此問題的更多信息,請參見此處 。
<plugin><!-- We use this plugin to ensure that our usage of themaven-jaxb2-plugin is JDK 8 compatible in absence of a fixfor https://java.net/jira/browse/MAVEN_JAXB2_PLUGIN-80. --><groupId>org.codehaus.mojo</groupId><artifactId>properties-maven-plugin</artifactId><version>1.0.0</version><executions><execution><id>set-additional-system-properties</id><goals><goal>set-system-properties</goal></goals></execution></executions><configuration><properties><property><name>javax.xml.accessExternalSchema</name><value>file,http</value></property><property><name>javax.xml.accessExternalDTD</name><value>file,http</value></property></properties></configuration> </plugin>

就是這樣。 我會繼續更新這篇文章。 與往常一樣,您對此的反饋總是非常感激。

謝謝您的閱讀,祝大家有美好的一天。

翻譯自: https://www.javacodegeeks.com/2016/08/introduction-working-jaxb.html

總結

以上是生活随笔為你收集整理的使用JAXB的简介的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。