1. 程式人生 > >通過JDK的JAXBContext類來轉換java實體類bean和xml格式字串的一些問題和解決辦法

通過JDK的JAXBContext類來轉換java實體類bean和xml格式字串的一些問題和解決辦法

    這兩天工作中用到web service來推送資料,涉及到xml的和java實體類的轉換,總結一下理解和碰到的問題。

    (一)、寶寶想得到下面這樣的兩個xml型別的字串anth和args,來推送給第三方:

<?xml version="1.0" encoding="UTF-8"?>
<base>
   <root>
      <user></user><!—-登入賬號 -->  
      <password></password><!—-登入密碼 -->     
   </root>
</base>
<?xml version="1.0" encoding="UTF-8"?>
<base>
   <root>
      <inspecMMe>
	<name></name>
	<sex></sex>
	<friends>
	    <friend>
	        <age></age>
	    </friend>
	</friends>
      </inspecMMe>
   </root>
</base>

    我們已經知道用JAXBContext可以把實體生成xml字串,那麼實體怎麼設定呢:

    寶寶的想法是設定一個base實體,裡面嵌套個root實體作為屬性,再巢狀其他......但是發現base下面的root的元素可是有兩個不同的版本呀,一個下面是user和password,另一個是inspecMMe,於是就用繼承來實現啦,base裡面嵌套個root,例項化時候可以傳入Root.java的子類AnthRoot.java或InspecMMe.java,從而達到可以選擇生成哪個版本的字串啦。

    注意點(看圖片裡的紅圈圈哦,寶寶也可以點進去看看它原始碼是什麼意思哦):


    Base.java   Root.java   ArgsRoot.java   InspecMMe.java   Friend.java,其中AnthRoot.java和ArgsRoot.java繼承自Root.java。

    這樣就可以生成了Anth字串:

public static String getAnth(String user, String password){
	String result = XMLUtil.convertToXml(new Base(new AnthRoot(user,password)));
	return result;
}

     這樣就可以生成Args字串:

public static String getArgs(String name, String sex, List<Friend> Friends){
	InspecMMe im = new InspecMMe(name, sex, Friends);
	String result = XMLUtil.convertToXml(new Base(new ArgsRoot(im)));
	return result;
}

   我們看看Base.java、Root.java、AnthRoot.java和ArgsRoot.java:

@XmlAccessorType(XmlAccessType.FIELD)
//xml檔案的根元素
@XmlRootElement(name = "base")
@XmlType
@XmlSeeAlso(value={ AnthRoot.class, ArgsRoot.class })
public class Base implements Serializable{

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * root元素實體
	 */
	@XmlElementRef(type=AnthRoot.class)
	private Root root;

	public Base() {
		super();
	}

	public Base(Root root) {
		super();
		this.root = root;
	}

	public Root getRoot() {
		return root;
	}

	public void setRoot(Root root) {
		this.root = root;
	}

}
@XmlAccessorType(XmlAccessType.FIELD)
//xml檔案的根元素
@XmlRootElement(name = "root")
//控制JAXB 繫結類中屬性和欄位的排序
@XmlType
public class Root implements Serializable {

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

}
@XmlAccessorType(XmlAccessType.FIELD)
//xml檔案的根元素
@XmlRootElement(name="root")
//控制JAXB 繫結類中屬性和欄位的排序
@XmlType(propOrder = {"user","password"})
public class AnthRoot extends Root{

	/**
	 * serialVersionUID
	 */
	private static final long serialVersionUID = 1L;

	/**
	 * 登入帳號
	 */
	private String user;
	
	/**
	 * 登入密碼
	 */
	private String password;

	public AnthRoot() {
		super();
	}

	public AnthRoot(String user, String password) {
		super();
		this.user = user;
		this.password = password;
	}


	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
}
@XmlAccessorType(XmlAccessType.FIELD)
//xml檔案的根元素
@XmlRootElement(name="root")
//控制JAXB 繫結類中屬性和欄位的排序
@XmlType
public class ArgsRoot extends Root implements Serializable {

	/**
	 * serialVersionUID 
	 */
	private static final long serialVersionUID = 1L;
	
	private InspecMMe inspecMMe;

	public ArgsRoot() {
		super();
	}

	public ArgsRoot(InspecMMe inspecMMe) {
		super();
		this.inspecMMe = inspecMMe;
	}

	public InspecMMe getInspecMMe() {
		return inspecMMe;
	}

	public void setInspecMMe(InspecMMe inspecMMe) {
		this.inspecMMe = inspecMMe;
	}
	
}



相關推薦

通過JDK的JAXBContext轉換java實體beanxml格式字串一些問題解決辦法

    這兩天工作中用到web service來推送資料,涉及到xml的和java實體類的轉換,總結一下理解和碰到的問題。    (一)、寶寶想得到下面這樣的兩個xml型別的字串anth和args,來推送給第三方:<?xml version="1.0" encoding

JAVA jdbc ResultSet 通過反射機制轉換實體Bean

最近專案又有一部分用到jdbc了。。。都快忘光了。。。複習了一下,在這記錄一下。肯定有有問題的地方,歡迎指正。 轉實體類工具 /** * 公司名稱: * 專案名稱: * 版本號 : 1.0 * 建立時間:2017/3/24 16:19

通過數據庫中的表,使用 MyEclipse2017的反向生成工具-->hibernate反轉引擎引擎(MyEclipse2017自帶的插件) 反轉生成實體對應的映射文件

需要 ria sdn http rap div aci radi 工具 Java視圖 1、在MyEclipse中,Java視圖下,新建一個普通的java project,新建該項目的目的是:用來接收反轉引擎生成的實體類和對應的映射文件。 2、在項目上右鍵 -->

java將JSON字串轉換實體物件,基於net sf json實現

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

通過資料庫中的表,使用 MyEclipse2017的反向生成工具-->hibernate反轉引擎引擎(MyEclipse2017自帶的外掛) 反轉生成實體對應的對映檔案

Java檢視 1、在MyEclipse中,Java檢視下,新建一個普通的java project,新建該專案的目的是:用來接收反轉引擎生成的實體類和對應的對映檔案。 2、在專案上右鍵 --> Configure Facets... --> Install Hibernate Facet   

JAXB工具實現java實體xml之間的轉換

<?xml version="1.0" encoding="GBK" standalone="yes"?> <student> <id>1</id> <name>羅志茂</name> <age>25

JAVA Map轉換實體實體轉換為MAP

package com.ruiguang.tools;import java.beans.BeanInfo;import java.beans.IntrospectionException;import java.beans.Introspector;import java.

java實體xml之間的轉換

一、XStream的用途          XStream是一個Java物件和XML相互轉換的工具,很好很強大。提供了所有的基礎型別、陣列、集合等型別直接轉換的支援。           因此XML常用於資料交換、物件序列化(這種序列化和Java物件的序列化技術有著本質的區別)。         S

數據庫表直接生成Java實體

dep script urn rac getclass direct time unicode auto 代碼如下: package com.nagios.info.entity; import java.io.File; import java.io.F

java中將SimpleDateFormat轉換成Date

test cst for orm exception 結果 cat sun java try {String dateString = "2009-08-02 13:43:00";DateFormat df = SimpleDateFormat("yyyy-MM-dd HH

java 實體 時間格式字段註解

小時 mat timezone att string 使用 如果 格式 字段 @DatetimeFormat是將String轉換成Date,一般前臺給後臺傳值時用 @JsonFormat(pattern="yyyy-MM-dd") 將Date轉換成String 一般後臺傳值

Java : 實體不能序列化異常

serial 異常 序列 join col 添加 序列化 之間 是否 當修改實體類之後調用接口出現不能序列化的異常時,一定要檢查實體之間的關系是否都是正確的. could not serialize; nested exception is org.hibernate.ty

jnhs-java實體的有參構造器 無參構造器Could not instantiate bean class 實體No default constructor found

 new一個物件的時候要用到建構函式, 例如Hello hello = new Hello();這時呼叫的是Hello的無引數構造方法; Hello hello = new Hello("hi");這個是呼叫Hello有引數構造方法, 在JAVA中如果不寫構造方法的話,會預設加上一個無引數的構

json字串java實體

本文參考自大神部落格:點選開啟連結 一、json強轉實體類 1.實體類 package test; public class PassPortForLendsEntity { private String passportid; private

mysql 自動生產java 實體指令碼

mysql有表了,但是要建實體類,都是重複性工作,比較浪費時間,於是有了自動生成實體類的想法。如果用mybatis generator,會生成很多沒必要的程式碼,而且很多,看起來更亂了,實際執行的sql,比普通的增刪查改要複雜,生成的sql也其實沒什麼用,實體類還比較有用,於是只要生成實體類

【MyBatis】解決資料庫欄位名稱與Java實體屬性名稱不一致問題

問題描述:       有時候在專案中會遇到資料庫欄位名稱與實體類屬性名稱取得不一樣的情況,如下:      資料庫裡的資料為:       此時,如果我們查詢該表的某條資料,Proj

java 實體 list 怎麼轉map

這是service層的 @Override     @Transactional     public PageVo<List<Map<String,Object>>> searchOrders(UserVo user,         

MyBatis反向生成Java實體Mapper對映檔案

首先在maven中新增 mybatis-generator-maven-plugin 外掛 <plugin> <groupId>org.mybatis.generator</groupId> <ar

SpringBoot通過配置檔案傳輸值到實體

1.建立一個配置檔案(appication.properties)項配置檔案加入以下: upload.target=D:/data/repository/upload/ upload.target.folder.1=yyyy upload.target.fold

JSON轉換實體實體巢狀多層list)

在專案中,rabbitMQ返回的不是JSON而是二進位制數json jar :import com.alibaba.fastjson.JSON;import net.sf.json.JSONObject;@MessageQueueListener(queues = "chec