通過MOXy實現使JAXB更加清潔

編組和解組XML時使用JAXB的主要優點是編程模型。 只需注釋幾個POJO并使用JAXB API,您就可以很容易地序列化為XML和從XML反序列化。 您無需擔心有關XML如何編組/解組的細節。 一切都比DOM和SAX等替代方案簡單得多。

現在,XML文件中的數據本質上趨于分層。 例如,考慮以下XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<person><firstname>Barok</firstname><lastname>Obama</lastname><age>52</age><car><model>Green Ford Focus 1.4L</model></car>
</person>

在這種情況下,Barok Obama人擁有的汽車是Green Ford Focus。 在這里,我們看到了XML的層次結構特征。 車在人下。 在一個更復雜的示例中,一個人可以擁有一個汽車,該汽車具有一個汽車收音機,該汽車具有一個放大器,該汽車具有晶體管等。但是,讓我們暫時堅持我們的簡單情況。 假設我們要使用JAXB解組該XML文件。 我們需要所有人的詳細信息(名字,姓氏等)以及屬于該人的汽車的型號。 我們創建一個Person POJO和一個Car POJO并進行適當的注釋。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name", "firstname", "lastname"})
public class Person {private String firstname;private String lastname;private int age;private Car car;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}public Car getCar() {return car;}public void setCar(Car car){this.car= car;}
}
public class Car {private String model;public String getModel() {return model;}public void setModel(String model){this.model = model;}
}

要解組,我們只需做

public static void unmarshall() throws Exception {JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();Person person = (Person)unmarshaller.unmarshal(new File("Person.xml"));System.out.println("Perosn is=" +person.toString());
}

這一切看起來非常簡單-特別是當您考慮到Car實體甚至不需要任何注釋時! 但是,Car僅具有一個屬性,對于我們只希望從中獲得一個屬性的東西擁有POJO類似乎有點過頭了! 記住,這是一個簡單的示例,想象一下層次結構是否更深。 類似于包含實體的外部實體,其中包含另一個實體,該實體甚至包含另一個實體,而我們所需的只是外部實體和來自最深層嵌套實體的一個屬性。 本質上是相同的問題,但更多的是矯kill過正。 我們必須確保層次結構中的所有內容都有POJO類,甚至對于我們一無所求的實體也是如此。 沒有人喜歡代碼膨脹。 所以,我們能做些什么?

我們首先要記住的是,JAXB是一個規范,該規范有許多實現(例如JaxMeAPI,MOXy,Metro)。 如果我們要使用JAXB參考實現(隨JDK一起提供,則無能為力)。 我們必須有一個汽車和人POJO。 但是,如果我們使用EclipseLink的MOXy實現,則可以使用其一些擴展來幫助我們。 更具體地說,我們可以使用受XPath啟發的MOXy @XmlPath擴展。

讓我們來看看它的作用。 這是更新的Person POJO。

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder={"name", "firstname", "lastname"})
public class Person {private String firstname;private String lastname;private int age;public String getLastname() {return lastname;}public void setLastname(String lastname) {this.lastname = lastname;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getFirstname() {return firstname;}public void setFirstname(String name) {this.firstname = name;}@XmlPath("car/model/text()")private String model;public String getModel() {return model;}
}

那么,汽車POJO哪里去了? 好吧,它被刪除了。 我們不再需要它了。 再見。
使用MOXy @XmlPath批注,我們不需要Car POJO。 該批注駐留在org.eclipse.persistence.oxm.annotations包中,將其放在類路徑中非常簡單。 如果您是maven用戶,只需添加:

<dependency><groupid>org.eclipse.persistence</groupId><artifactid>eclipselink</artifactId><version>2.3.2</version>
</dependency>

為了告訴您的JDK在運行時將MOXy用于JAXB實現,您放置了一個名為
jaxb.properties與JAXB POJO位于同一目錄中。 它包含一行:

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

為了確保您正在使用MOXy實現,只需檢查JAXB上下文:

JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
System.out.println("jaxbContext is=" +jaxbContext.toString());

您應該看到類似以下內容:

jaxbContext is=org.eclipse.persistence.jaxb.JAXBContext@5e3974

之后,沒有任何變化。 完全相同的數據編碼都可以使用。
我之所以真正喜歡此擴展的原因之一是因為它意味著更少的代碼。 這通常意味著更簡潔的代碼和更多可維護的代碼。 這在更復雜的情況下變得更加明顯,在這種情況下,實體的層次結構比該簡單示例要深得多。 如果使用XJC之類的東西來生成POJO沒關系,您仍然會感到代碼膨脹。

請記住,JAXB被設置為比JAXP替代品(例如SAX和DOM)更簡潔的編程模型,但是在具有深層次結構的場景中,使用JAXB對類進行概要分析并不能使它令人信服地更加簡潔。 請記住,使用DOM和XPath甚至僅使用SAX來忽略不需要的類將非常容易。

MOXy通過提供對XML文件中的任何內容使用XPath表達式的功能,將清潔的戰斗帶回了JAXB。

注意:MOXy剛剛作為WebLogic 12c的JAXB實現包含在內。

參考文獻:

  1. MOXy項目頁面
  2. Blaise Doughan的博客
  3. 來自都柏林技術博客的 JCG合作伙伴 Alex Staveley 通過MOXy實現使JAXB清潔器

相關文章 :

  • 使用JAXB從XSD生成XML
  • 重用生成的JAXB類
  • 將對象映射到多個XML模式–天氣示例
  • JAXB,SAX,DOM性能
  • 具有簡單框架教程的Android XML綁定

翻譯自: https://www.javacodegeeks.com/2012/01/make-your-jaxb-cleaner-with-moxy.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374488.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374488.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android 上下滾動文字_計算機畢設項目004之Android系統在線小說閱讀器

計算機畢設項目004之Android系統在線小說閱讀器一. 項目名稱基于Android系統的在線小說閱讀器二. 項目簡介項目中的角色功能&#xff1a;支持翻頁動畫:仿真翻頁、覆蓋翻頁、上下滾動翻頁等翻頁效果。支持頁面定制:亮度調節、背景調節、字體大小調節支持全屏模式(含有虛擬按鍵的…

697. 數組的度

給定一個非空且只包含非負數的整數數組 nums&#xff0c;數組的 度 的定義是指數組里任一元素出現頻數的最大值。 你的任務是在 nums 中找到與 nums 擁有相同大小的度的最短連續子數組&#xff0c;返回其長度。 來源&#xff1a;力扣&#xff08;LeetCode&#xff09; 鏈接&a…

python math模塊

1.math簡介 >>> import math >>>dir(math) #這句可查看所有函數名列表 [__doc__, __name__, __package__, acos, acosh, asin, asinh, atan, atan2, atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1, fabs, factorial, flo…

Visual Studio找不到adb.exe錯誤解決

Visual Studio找不到adb.exe錯誤解決 錯誤信息&#xff1a;Cannot find adb.exe in specified SDK path。出現這種情況&#xff0c;是因為沒有安裝Android SDK Platform-tools。解決辦法&#xff1a;在SDK Manager中&#xff0c;安裝該組件即可。 轉載于:https://www.cnblogs.c…

Vaadin應用程序中的EJB查找

自從我實現上一個服務定位器以來已經有很長時間了。 我認為不再需要考慮Java EE CDI &#xff08;上下文和依賴注入&#xff09;的成熟度。 我的第一個實現是在基于Struts的Web應用程序中使用EJB。 之后&#xff0c;我開始使用JSF&#xff0c;它只需要帶有EJB或Resource的帶注釋…

基線檢查工具_最新版CAD燕秀工具箱2.87(支持20042021)

好課推薦&#xff1a;零基礎CAD&#xff1a;點我CAD家裝&#xff1a;點我 周站長CAD&#xff1a;點我CAD機械&#xff1a;點我revit教程&#xff1a;點我CAD建筑&#xff1a;點我CAD三維&#xff1a;點我全屋定制&#xff1a;點我 ps教程&#xff1a;點我蘋果版CAD:點我 3dmax教…

團隊項目記錄2

遇到的問題&#xff1a;在對Trigger機關進行測試時發現&#xff0c;畫出的軌道也會將機關觸發。 問題描述&#xff1a;Trigger機關的作用是在發生碰撞時運行腳本中指定的特定物體的特定函數&#xff0c;在這個例子當中特定的物體是一塊地板&#xff0c;特定的函數的功能是刪除這…

關于java.lang.ArithmeticException

java.lang.ArithmeticException “數學運算異常”&#xff0c;可能是自己的數學運算公式出現了錯誤、違反了數學運算規則。錯誤記錄&#xff1a; 出錯原因&#xff1a; a % b 中b不能為0

1103. Integer Factorization (30)

題目如下&#xff1a; The K-P factorization of a positive integer N is to write N as the sum of the P-th power of K positive integers. You are supposed to write a program to find the K-P factorization of N for any positive integers N, K and P. Input Specifi…

Java EE 6與Spring Framework:技術決策過程

在過去的幾個月中&#xff0c;我們經歷了這個決策過程&#xff1a;為Java平臺上的企業開發選擇哪種技術堆棧&#xff1f; 有多種選擇。 但是&#xff0c;我們深入討論的是&#xff1a;純Java EE 6堆棧與帶有Java EE的Spring。 以下博客文章總結了當您考慮這些技術堆棧選項之一時…

DOM 基礎 HTML標簽 元素 屬性

什么是HTML標簽 HTML標簽標記了HTML文檔和HTML元素 HTML標簽由開始標簽和結束標簽組成.開始標簽為尖括號包圍的元素名,結束標簽為尖括號包圍的斜杠和元素名 例如:<h2> My First Heading</h2> HTML基本標簽 標題(Heading)是通過h1 - h6等標簽進行定義的.段落 是通過…

允許服務與桌面交互_vivo 正式推出 Origin OS,融合自然設計與全新交互

點擊右上角關注我們&#xff0c;每天給您帶來最新最潮的科技資訊&#xff0c;讓您足不出戶也知道科技圈大事&#xff01;今天下午&#xff0c;vivo 推出了全新 Origin OS 手機系統。它采用了源于自然界的設計理念&#xff0c;同時加入了全新并且允許用戶進行深度自定義的交互方…

Error - Found cycle in the ListNode

Error - Found cycle in the ListNode 刷力扣時遇到這個錯誤&#xff0c;節點成環 自己摸索了一下發現確實形成循環&#xff0c;原題是206反轉鏈表&#xff0c;我用的是棧&#xff0c;先將鏈表節點依次進棧&#xff0c;然后依次出棧鏈接&#xff0c;構成反轉。但是我忽略了第一…

JUnit 4.9(測試版3)中的規則

不久前&#xff0c; David Saff宣布了JUnit 4.9的beta版 。 因此&#xff0c;我認為現在是研究該版本中的新增功能的好時機。 JUnit領域中最有用的創新之一是Rule。 我在這里寫了有關規則的文章 。 我在這里寫了有關JUnit規則的用例 。 規則很棒。 借助JUnit 4.9&#xff0c;它…

計算機網絡-終端

我們常用的電腦來說&#xff0c;外圍設備就是終端。 外圍設備包括顯示器、鼠標、鍵盤等等。 負責向主機輸入數據的就叫輸入終端&#xff0c;比如鼠標、鍵盤、麥克風、攝像頭&#xff1b; 負責接收主機輸出數據的設備就被稱作輸出終端&#xff0c;比如顯示器、耳機。 注意一點…

為什么我喜歡Java的細節

他們說&#xff0c;Java太冗長了。 您可以找到Hello World程序的比較結果&#xff0c;這些程序在ruby中使用2行&#xff0c;在Java中使用10行&#xff0c;要讀取文件&#xff0c;您需要使用Java 20行和php中1行。 盡管示例經常被夸大&#xff08;例如&#xff0c;計算導入次數&…

dll 源碼_【技術分享】 | 一個JAVA內存馬的源碼分析

前言偶然接觸到了這樣一個JAVA內存馬&#xff0c;其作者也是冰蝎的作者&#xff0c;項目地址&#xff1a;https://github.com/rebeyond/memShell正好最近在接觸JAVA&#xff0c;借此機會學習下大佬的代碼&#xff0c;對自己的編程思路也有了一定的提升。當然筆者只是一個腳本小…

ThunderSearch(閃電搜索器)_網絡空間搜索引擎工具_信息收集

文章目錄 ThunderSearch簡介1 項目地址2 使用方式2.1 配置文件config.json說明2.2 構建和運行 3 使用式例 ThunderSearch簡介 ThunderSearch&#xff08;閃電搜索器&#xff09;是一款使用多個(【支持Fofa、Shodan、Hunter、Zoomeye、360Quake網絡空間搜索引擎】網絡空間搜索引…

字符串匹配方法

介紹兩種字符串匹配方法1.暴力匹配母串用s表示&#xff0c;長度為m子串用p表示&#xff0c;長度為n時間復雜度為:(m-n1)n算法&#xff1a;從s串的第一個字符開始匹配&#xff0c;若匹配&#xff0c;繼續根據p向后匹配&#xff0c;若后續的不匹配&#xff0c;s右移重新匹配p 2.K…

區分幾進制的標志

自己總是記不住進制的開頭標記&#xff0c;就寫下來忘了就看看 1.二進制&#xff1a;Binary&#xff0c;數字以0b 、0B開頭 2.八進制&#xff1a;octal number system&#xff0c;數字自然以0打頭 3.十六進制&#xff1a;hexadecimal&#xff0c;以0x、0X開頭