文档章节

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

 剧终人散
发布于 2015/12/25 16:12
字数 855
阅读 20
收藏 0
点赞 0
评论 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
博文 6
码字总数 2205
作品 0
浦东
jaxb替换smooks项目方案建议书

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

WinnieChan ⋅ 2013/08/02 ⋅ 0

EclipseLink 2.5 发布,企业级 ORM 平台

EclipseLink 平台由多个组件构成,主要有EclipseLink-ORM,EclipseLink-OXM,EclipseLink-SDO, EclipseLink-DAS,EclipseLink-DBWS,EclipseLink-XR,EclipseLink-EIS。其中, EclipseLink-......

oschina ⋅ 2013/05/30 ⋅ 1

我在安装eclipse的web插件时出现以下错误,求解

安装插件时,报了以下错误: Your original request has been modified. "JavaScript Development Tools" will be ignored because it is already installed. "Eclipse Java Web Developer To......

菜鸟刘 ⋅ 2016/02/21 ⋅ 0

企业ORM平台--EclipseLink/TopLink

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

匿名 ⋅ 2008/10/05 ⋅ 0

使用 JAXB 框架定制 Web 服务行为

Web 服务概述 从本质上来讲 Web 服务就是对外暴露的并能够通过 Web 进行调用的一组 API,它并不要求服务提供方及调用方的技术实现、编程语言、运行平台甚至操作系统等。也正因为这个特点 We...

红薯 ⋅ 2010/03/24 ⋅ 1

JAXB 解决XML与JavaBean的互换

JAXB 解决XML与JavaBean的互换 声明 版权所有,转载请注明出处 文章概要 基于JAXB2 的xml bean 转换工具 正文 运行环境 JDK,Dom4j JAXB 实现xml和javabean的编组和解组 测试用例:JavaBean 测试...

Cong_Cong ⋅ 2015/11/25 ⋅ 0

Java处理XML的三种主流技术

大名鼎鼎的 DOM 说它大名鼎鼎可是一点不为过,DOM 是 W3C 处理 XML 的标准 API,它是许多其它与 XML 处理相关的标准的基础,不仅是 Java,其它诸如 Javascript,PHP,MS .NET 等等语言都实现...

e良师益友 ⋅ 2016/01/13 ⋅ 0

Java 处理 XML 的三种主流技术及介绍

XML (eXtensible Markup Language) 意为可扩展标记语言,它已经是软件开发行业中大多数程序员和厂商用以选择作为数据传输的载体。本文作者对于 Java 处理 XML 的几种主流技术进行一些总结和介...

IBMdW ⋅ 2012/08/14 ⋅ 15

EclipseLink Moxy对最新java api for json(JSR-353)的实现

最新的jave ee 7中,对JSON的解析实现使用的是JSR-353,其中,Eclipse旗下的EclipseLink开源项目向JAVE EE 7中贡献了不少力量,其中包括JPA 2.1 (JSR-338)的实现,另外一个贡献是本文向大家介绍...

jackyrong ⋅ 2013/08/10 ⋅ 0

IOC控制反转中的JAXB

Spring的核心的轻量级的容器是一个实现了IOC(Inversion Of Control)的容器,它是一个非侵入式性的框架,提供了一个aop(aspectoriented programming)的面向切面的概念实现方式。下面是一个...

小老傅 ⋅ 2013/10/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux kernel脉络和主干总结

写在前面 前人常说,对Linux操作系统/内核的理解,是计算机行业从业者的内功,决定了你在技术领域想走多远。但内核的庞大以及学习曲线之陡峭,总让我在学习途中觉得犹如“管中窥豹”。 随着工...

Markz0928 ⋅ 8分钟前 ⋅ 0

在gcc中使用intel风格的内联汇编

很简单,内联汇编使用asm(“.intel_syntax noprefix/n”)声明一下,以后的内联汇编就可以用intel风格了,构建可执行文件时给gcc加上-masm=intel参数。 先写一个小程序测试一下: [cpp] view...

simpower ⋅ 19分钟前 ⋅ 0

NIO 之 ByteBuffer实现原理

相关文章 BIO、NIO、AIO 内部原理分析 NIO 之 Selector实现原理 NIO 之 Channel实现原理 前言 Java NIO 主要由下面3部分组成: Buffer Channel Selector 在传统IO中,流是基于字节的方式进行...

轨迹_ ⋅ 28分钟前 ⋅ 0

Jenkins docker权限问题

环境Ubuntu Server 工具 jenkins-war:2.89.2 报错信息 Cannot connect to the Docker daemon. Is the docker daemon running on this host?Build step 'Execute shell' marked build as fai......

Pulsar-V ⋅ 28分钟前 ⋅ 0

180621-一个简单的时间窗口设计与实现

如何设计一个计数的时间窗口 时间窗口,通常对于一些实时信息展示中用得比较多,比如维持一个五分钟的交易明细时间窗口,就需要记录当前时间,到五分钟之前的所有交易明细,而五分钟之前的数...

小灰灰Blog ⋅ 51分钟前 ⋅ 0

Android之Dalvik、ART、JIT、AOT

Android之Dalvik、ART、JIT、AOT 本文内容:Dalvik、ART、JIT、AOT之间关系 本文定位:知识记录 学习过程记录,加深理解,提升文字组合表达能力。也希望能给学习的同学一些灵感 本文整理于[...

lichuangnk ⋅ 55分钟前 ⋅ 0

Thrift RPC实战(五) thrift连接池

Thrift本身没有提供连接池,我们可以用Apache Commons Pool2来实现一个 一、定义对象工厂 BasePooledObjectFactory<T> extends BaseObject implements PooledObjectFactory<T> public class......

lemonLove ⋅ 55分钟前 ⋅ 0

git 命令简写

简写 命令 g git gst git status gd git diff gdc git diff --cached gdv git diff -w "$@" | view - gl git pull gup git pull --rebase gp git push gc git commit -v gc! git commit -v ......

charley158 ⋅ 今天 ⋅ 0

Java中的锁使用与实现

1.Lock接口 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。 在Lock出现之前,java程序是靠synchronized关键字实现锁功能的,而Java SE5之后,...

ZH-JSON ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧四-类和方法注释模板设置

IDEA自带的注释模板不是太好用,我本人到网上搜集了很多资料系统的整理了一下制作了一份比较完整的模板来分享给大家,我不是专业玩博客的,写这篇文章只是为了让大家省事。 这里设置的注释模...

Mkeeper ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部