文档章节

eclipseLink基于JAXB方式实现javabean与xml的互转

 剧终人散
发布于 2015/12/25 16:12
字数 855
阅读 273
收藏 0

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

    项目中经常需要遇到使用xml方式传输数据,这样就无可避免的要说到xml的框架。就我个人使用的主要有dom4j、xstream。以个人观点来看,dom4j写xml文件较繁琐,但是查询结合xpath时十分便捷;xstream十分小巧方便,但在做节点的属性时需要费点周折,比如<name id="aaa1">张三</name>,对于这种需要另外定义一个converter。

    JAXB在我看来兼顾了dom4j的查询便捷、xstream的写xml的方便。不过我说的是基于eclipselink的MOXy实现的,它实现了基于xpath的方式写入和解析xml文件。eclipselink的MOXy添加了@XmlPath的注解,将xml的节点或属性与javabean的属性做一对一的映射。对集合类型的支持也十分友好。

    例如xml结构如下

<?xml version="1.0" encoding="GBK"?>
<SONRS>
     <STATUS ID="AAA">
           <CODE>0</CODE>
           <SEVERITY>INFO</SEVERITY>
     </STATUS>
     <DTSERVER>2015-12-24 13:56:23</DTSERVER>
     <LIST>
           <USER>
               <NAME>张三</NAME>
           </USER>
           <USER>
               <NAME>李四</NAME>
           </USER>
     </LIST>
</SONRS>

    定义一个操作员的登录信息校验的VO,

package com.test.xmlCnvtr;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

/**
 * 操作员登录验证响应
 * @author wade
 *
 */
@XmlRootElement(name = "SONRS")
@XmlAccessorType(XmlAccessType.FIELD)
public class SonRs {
        @XmlPath("/STATUS/@ID")
	private String ID;//ID号
        
	private String DTSERVER;//客户端日期时间
	
	@XmlPath("/STATUS/CODE/text()")
	private String CODE;//处理结果码
	
	@XmlPath("/STATUS/SEVERITY/text()")
	private String SEVERITY;//处理结果等级
	
	@XmlPath("/STATUS/MESSAGE/text()")
	private String MESSAGE;//消息描述
	
	@XmlPath("/LIST/USER")
	private List<User> list;//人员信息列表
	
	public List<User> getList(){
	    return list;
	}
	
	public void setList(List<User> list){
	    this.list = list;
	}
	
	public String getID(){
	    return ID;
	}
	
	public void setID(String iD){
	    ID = iD;
	}
	
	public String getMESSAGE() {
		return MESSAGE;
	}

	public void setMESSAGE(String mESSAGE) {
		MESSAGE = mESSAGE;
	}

	public String getDTSERVER() {
		return DTSERVER;
	}

	public void setDTSERVER(String dTSERVER) {
		DTSERVER = dTSERVER;
	}

	public String getCODE() {
		return CODE;
	}

	public void setCODE(String cODE) {
		CODE = cODE;
	}

	public String getSEVERITY() {
		return SEVERITY;
	}

	public void setSEVERITY(String sEVERITY) {
		SEVERITY = sEVERITY;
	}
	
	
}

    List列表中的用户信息vo

package com.test.xmlCnvtr;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

import org.eclipse.persistence.oxm.annotations.XmlPath;

/**
 * 操作员登录验证响应
 * @author wade
 *
 */
@XmlRootElement(name = "USER")
@XmlAccessorType(XmlAccessType.FIELD)
public class User {
        @XmlPath("/NAME/text()")
	private String NAME;//名称
	
	public void setNAME(String name){
	    this.NAME = name;
	}
	
	public String getNAME(){
	    return NAME;
	}
}
package com.test.util;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * MOXy jaxb工具类,用于xml与javabean的相互装换
 * @author wade
 *
 */
public class MOXyJaxbUtil {
	
	private static final Log logger = LogFactory.getLog(MOXyJaxbUtil.class);

	/** 
	 * JavaBean转换成xml 
	 * 默认编码UTF-8 
	 * @param obj 
	 * @param writer 
	 * @return  
	 * @throws JAXBException 
	 */  
	public static String convertToXml(Object obj) throws JAXBException {  
		return convertToXml(obj, "GBK");
	}  

	/** 
	 * JavaBean转换成xml 
	 * @param obj 
	 * @param encoding  
	 * @return  
	 * @throws JAXBException 
	 */  
	public static String convertToXml(Object obj, String encoding) throws JAXBException {  
		String result = null;
		
		JAXBContext context = JAXBContext.newInstance(obj.getClass());  
		Marshaller marshaller = context.createMarshaller();  
		marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);  
		marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);

		StringWriter writer = new StringWriter();
		marshaller.marshal(obj, writer);  
		result = writer.toString();
		
		return result;  
	}  

	/** 
	 * xml转换成JavaBean 
	 * @param inputStream 
	 * @param c 
	 * @return 
	 * @throws JAXBException 
	 */  
	@SuppressWarnings("unchecked")  
	public static <T> T converyToJavaBean(InputStream inputStream, Class<T> c) throws JAXBException {  
		T t = null;  
		JAXBContext context = JAXBContext.newInstance(c);  
		Unmarshaller unmarshaller = context.createUnmarshaller();
		t = (T) unmarshaller.unmarshal(inputStream);  
		return t;  
	}
	/** 
	 * xml转换成JavaBean 
	 * @param str xml 
	 * @param c 
	 * @return 
	 * @throws JAXBException 
	 */  
	public static <T> T converyToJavaBean(String str, Class<T> c) throws JAXBException {  
		return converyToJavaBean(new ByteArrayInputStream(str.getBytes()),c);  
	}

}

   有一个问题需要注意,在实施过程中,发现部分项目返回的xml只有数据体,没有包含

<?xml version="1.0" encoding="GBK"?>

    在实际的解析过程中,因为我的JVM默认走的是UTF-8,而对方返回的xml是GBK的,所以导致解析出错。jaxb utf-8 unmarshal exception invalid byte 1of 2 byte utf-8 sequence。此时在返回的数据体上添加xml格式头即可。


© 著作权归作者所有

粉丝 0
博文 8
码字总数 2205
作品 0
浦东
私信 提问
加载中

评论(0)

jaxb替换smooks项目方案建议书

1 前言 本文档是描述Smooks的应用情况,以及使用Jaxb替换smooks的可行性分析及实施方案,有不足之处还望谅解和指出。 2 背景 项目系统中使用Smooks出现几次死锁问题导致系统宕机,其后针对S...

WinnieChan
2013/08/02
1K
1
Java_数据交换_JAXB_用法入门

一、前言 最近有个需求,需要进行xml 与 bean 的相互转化。 使用 JAXB 可完成这个需求。 二、概述 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产...

osc_0i27cy0p
2018/08/02
6
0
JAXB(Java Architecture for XML Binding) 详解及实例分析

一、简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将...

kone666
2018/12/09
0
0
Java的xml与map,与Bean互转

xml与map互转,主要使用dom4j import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.OutputForma......

osc_7luy07ds
2019/03/25
2
0
企业ORM平台--EclipseLink/TopLink

Oracle 最近宣布把企业级的ORM平台TopLink代码捐献给Eclipse社区,发起并领导名为EclipseLink的Eclipse持久平台项目。 Eclipse持久平台由多个组件构成,主要有EclipseLink-ORM,EclipseLink...

匿名
2008/10/05
1.4W
0

没有更多内容

加载失败,请刷新页面

加载更多

文献速递20200524

一 文献题目:Characterizing the Causal Pathway for Genetic Variants Associated with Neurological Phenotypes Using Human Brain-Derived Proteome Data 不想看英文题目:使用人脑蛋白质......

osc_mbhfa1vl
51分钟前
9
0
【Java入门】JDK安装和环境变量配置(Win7版)

系统环境:Windows7 x64 安装JDK和JRE版本:1.8.0_191 1、下载JDK安装包 Oracle官网下载网址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 选择需要下载的JDK版本...

osc_s7aj86hu
52分钟前
11
0
Android Q 指纹解锁流程

Android Q 指纹解锁流程 // Authentation Finger Schedule: (close Screen, Authentation with finger(Success))        // PhoneWindowManager        mKeyguardDelegate.onStar......

osc_0qnrwmy3
54分钟前
12
0
List的扩容机制,你真的明白吗?

一:背景 1. 讲故事 在前一篇大内存排查中,我们看到了Dictionary正在做扩容操作,当时这个字典的count=251w,你把字典玩的66飞起,其实都是底层为你负重前行,比如其中的扩容机制,当你遇到...

osc_34b9n45c
56分钟前
14
0
2020.04.12软件更新公告

原创软件区升级ComicsViewer、DjVuToy、Pdg2Pic、PdgRenamer、PdgThumbViewer

osc_6tgtqi6v
56分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部