`
shihuan830619
  • 浏览: 582905 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

commons-betwixt的一些应用

    博客分类:
  • J2EE
阅读更多
环境:
commons-betwixt-0.8.jar和commons-digester-2.1.jar(这个地方digester的jar包可以是1.8版本,但千万不能是3.0版本的)
java-version-5.0

commons-betwixt对带有集合javabean转换的约定:
1、集合属性的名字要以集合元素类的名字开头(大小写不敏感)
2、每个Bean都必须有一个不带参数的构造方法。或者bean不要写任何构造方法(这样实际上有一个默认的不带参数的构造方法)
3、每个对于包含其他Bean集合的Bean,要有一个addXxxBean(XxxBean bean)的方法,只有这样,才能保证将xml转换为java的时候,集合属性不丢失

例子:一个人Person可以有多个宠物Pet,现在创建一个Person,将其转换为XML,然后做个逆转。

Pet.java代码:
import java.io.Serializable;

public class Pet implements Serializable {

	private String nikename;   //昵称 
    private String color;      //颜色 

    /** 
     * 这个默认的构造方法不可少 
     */ 
    public Pet() { 
    }

	public Pet(String nikename, String color) {
		this.nikename = nikename;
		this.color = color;
	}

	public String getNikename() {
		return nikename;
	}

	public void setNikename(String nikename) {
		this.nikename = nikename;
	}

	public String getColor() {
		return color;
	}

	public void setColor(String color) {
		this.color = color;
	}
	
	public String toString() {	
        return "Pet{" +  "nikename='" + nikename + '\'' + ", color='" + color + '\'' + '}'; 
	} 

}


Person.java代码:
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Person implements Serializable {

	private String name;   //姓名 
    private int age;       //年龄 
    private List<Pet> petList;    //拥有的宠物
    
    /** 
     * 这个默认的构造方法不可少,否则转换出错 
     */ 
    public Person() { 
    	petList = new ArrayList<Pet>(); 
    } 

    public Person(String name, int age) { 
    	petList = new ArrayList<Pet>(); 
        this.name = name; 
        this.age = age; 
    }
    
    //------------add集合成员的方法----------- 

    /** 
     * 添加集合属性元素的方法,add后的单词必须决定了xml中元素的名字 
     * @param pet 
     */ 
    public void addPet(Pet pet) { 
    	petList.add(pet); 
    } 

    //------------getter/setter----------- 

    public String getName() { 
    	return name; 
    } 

    public void setName(String name) { 
    	this.name = name; 
    } 

    public int getAge() { 
    	return age; 
    } 

    public void setAge(int age) { 
    	this.age = age; 
    } 

    public List<Pet> getPetList() { 
    	return petList; 
    } 

    public void setPetList(List<Pet> petList) { 
    	this.petList = petList; 
    } 

    public String toString() { 
    	StringBuffer sb = new StringBuffer(); 
        sb.append("Person{" + "name='" + name + '\'' + ", age=" + age + ", petList=\n"); 
        for (Pet pet : petList) { 
        	sb.append("\t\t" + pet.toString()).append(";\n"); 
        } 
        sb.append('}'); 
        return sb.toString(); 
    }
}


TestBetwixt.java代码:
import java.beans.IntrospectionException;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;

import org.apache.commons.betwixt.io.BeanReader;
import org.apache.commons.betwixt.io.BeanWriter;
import org.xml.sax.SAXException;

import com.commonsbetwixt.dto.Person;
import com.commonsbetwixt.dto.Pet;

public class TestBetwixt {

	public static String java2XML() throws IOException, SAXException, IntrospectionException {
		String reslutXml;

		// 创建一个输出流,将用来输出Java转换的XML文件
		StringWriter outputWriter = new StringWriter();

		// 输出XML的文件头
		outputWriter.write("<?xml version='1.0' ?>\n");

		// 创建一个BeanWriter实例,并将BeanWriter的输出重定向到指定的输出流
		BeanWriter beanWriter = new BeanWriter(outputWriter);

		// 配置BeanWriter对象
		beanWriter.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
		beanWriter.getBindingConfiguration().setMapIDs(false); // 不自动生成ID
		beanWriter.setWriteEmptyElements(true); // 输出空元素
		beanWriter.enablePrettyPrint(); // 格式化输出

		// 构建要转换的对象
		Person person = new Person("唐伯虎", 24);
		Pet pet1 = new Pet("旺财", "黄色");
		Pet pet2 = new Pet("小强", "灰色");
		person.getPetList().add(pet1);
		person.getPetList().add(pet2);

		// 将对象转换为XML
		beanWriter.write(person);
		// 获取转换后的结果
		reslutXml = outputWriter.toString();

		// 关闭输出流
		outputWriter.close();

		return reslutXml;
	}

	
	public static Person xml2Java(String xml) throws IntrospectionException, IOException, SAXException {
		// 创建一个读取xml文件的流
		StringReader xmlReader = new StringReader(xml);
		// 创建一个BeanReader实例,相当于转换器
		BeanReader beanReader = new BeanReader();

		// 配置BeanReader实例
		beanReader.getXMLIntrospector().getConfiguration().setAttributesForPrimitives(false);
		beanReader.getBindingConfiguration().setMapIDs(false); // 不自动生成ID
		// 注册要转换对象的类,并指定根节点名称
		beanReader.registerBeanClass("Person", Person.class);

		// 将XML解析Java Object
		Person person = (Person) beanReader.parse(xmlReader);

		return person;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		
		try {
			String xml = java2XML();
			System.out.println(xml);
			
			Person person = xml2Java(xml); 
	        System.out.println(person);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (SAXException e) {
			e.printStackTrace();
		} catch (IntrospectionException e) {
			e.printStackTrace();
		} 
   
	}

}


运行结果:
log4j:WARN No appenders could be found for logger (org.apache.commons.betwixt.io.AbstractBeanWriter).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
<?xml version='1.0' ?>
  <Person>
    <age>24</age>
    <name>唐伯虎</name>
    <petList>
      <pet>
        <color>黄色</color>
        <nikename>旺财</nikename>
      </pet>
      <pet>
        <color>灰色</color>
        <nikename>小强</nikename>
      </pet>
    </petList>
  </Person>

Person{name='唐伯虎', age=24, petList=
		Pet{nikename='旺财', color='黄色'};
		Pet{nikename='小强', color='灰色'};
}


看到了吧,双向转换成功了。

但是修改下petList属性的名字,修改下getPetList、setPetList的名字,去掉默认的构造方法,使得不符合上面的约定原则,双向转换就失败了。

另外,经过commons-betwixt还有一个问题,就是在将xml转Java过程中,如果日期数据元素为空,则导致转换失败。解决办法是,将java转xml的时候,设置忽略空元素beanWriter.setWriteEmptyElements(false);,在将xml转java 的时候,空日期元素删除掉即可。
分享到:
评论
1 楼 mazongfei 2013-06-17  
我的beanReader.registerBeanClass("Person", Person.class);  这行代码出错 是怎么情况?The type org.apache.commons.digester.Digester cannot be resolved. It is indirectly referenced from required .class
files

相关推荐

    commons-betwixt-0.8的相关文件

    在实际应用中,Apache Commons Betwixt可以用于构建Web服务、持久化层或者配置文件的解析。由于0.8版本相对较旧,它可能不包含后来版本中的一些增强特性,例如更好的性能优化、对Java新特性的支持或更丰富的映射选项...

    commons-betwixt-0.8.rar源文件及jar包

    在实际应用中,Apache Commons Betwixt可能与其他Java XML处理库(如JAXB、XStream)一起比较,选择最适合项目需求的工具。虽然Betwixt相对较为简单,但它在处理基本的XML数据绑定时仍然非常有效。对于更复杂的需求...

    java使用commons-betwixt 实现bean与xml互转

    Java中的Apache Commons Betwixt库提供了一个简单的方法来映射Java Bean对象和XML文档之间的数据,使得在处理数据交换时能轻松地实现bean到XML的转换和XML到bean的反转换。本篇文章将深入探讨如何使用Commons ...

    commons-betwixt-0.5-src.zip_ObjectStringConvert_commons-betwixt_

    Apache Commons Betwixt 是一个Java库,它简化了JavaBean对象与XML文档之间的相互转换。这个工具包的核心功能在于,它允许开发者自动地将JavaBean的属性映射到XML结构,反之亦然,极大地提高了开发效率,尤其是在...

    apache-commons源码及jar文件

    Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka Commons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试. Launcher Launcher 组件是一个交叉平台的Java 应用...

    apache-common最全的jar包

    这个压缩包包含了一些 Apache Commons 的核心模块,让我们逐一分析这些 jar 包所代表的知识点。 1. **commons-math-2.2.jar**: 这是 Apache Commons Math 库,提供了一系列数学和统计计算功能,包括线性代数、...

    commons所有jar包

    3. **commons-betwixt-0.8.zip**:Betwixt是一个对象到XML绑定工具,它可以自动将Java对象序列化为XML,并从XML反序列化回对象,帮助开发者处理XML数据。 4. **commons-lang-2.4-bin.zip**:Lang提供了一些在Java...

    xml操作之betwixt实例

    在实际应用中,Betwixt可以极大地提高开发效率,特别是在处理大量XML数据时。然而,需要注意的是,Betwixt并不支持所有的XML特性,例如命名空间。对于更复杂的XML处理需求,开发者可能需要考虑使用JAXB、XStream或...

    比较全面的:Jakarta-commons jar包(附: chm参考手册 & 资源简介)

    commons-betwixt 这个组件提供一个XML自省(introspection)机制用来把Java Bean映射到XML文档 commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz...

    Jakarta commons docs API CHM 格式

    commons-betwixt 这个组件提供一个XML自省(introspection)机制用来把Java Bean映射到XML文档 commons-chain 提供实现组织复杂的处理流程的“责任链模式” commons-cli 命令行参数解析 , 由 Werken, Avalon 和 Optz...

    commons jar

    5. **commons-betwixt-0.8.jar**:Apache Commons Betwixt是一个对象到XML绑定工具,可以帮助将Java对象序列化为XML,以及从XML反序列化回Java对象。0.8版本提供了一种声明性的方式来描述对象和XML之间的映射。 6. ...

    Java开发常用jar包

    10.commons-Betwixt.jar:XML与Java对象之间相互转换。 11.commons-dbcp.jar:是一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。 12.commons-DbUtils.jar:Apache组织提供的一...

    apache.commons所有jar包

    4. **commons-lang-2.4-bin.zip**:Apache Commons Lang库,扩展了Java语言的一些功能,如字符串处理、日期和时间操作、数学函数以及反射和异常处理工具。 5. **commons-io-1.4-bin.zip**:Apache Commons IO库,...

    apache commons jar包

    3. **commons-betwixt**:是XML绑定工具,能够将Java对象与XML文档相互转换,简化数据交换和序列化。 4. **commons-lang**:提供了许多Java语言功能的增强,包括字符串操作、异常处理、日期时间处理等,是Java开发...

    orgapachecommons.zip

    6. **commons-betwixt-0.8.zip**:Apache Commons Betwixt,一个XML绑定工具,使得Java对象和XML文档之间的序列化和反序列化变得更加容易。 7. **commons-lang-2.4-bin.zip**:Apache Commons Lang的2.4版本,包含...

    xml转换java对象

    XML(eXtensible Markup Language)是一种用于存储和交换数据的标记语言,广泛应用于软件开发、Web服务和数据存储等领域。在Java编程中,我们经常需要将XML文件的数据转换为Java对象,以便于处理和操作。Apache ...

    XML操作之betwixt

    1. **引入库**:你需要将`commons-betwixt-0.8.jar`文件添加到你的项目类路径中,这是使用Betwixt的前提。 2. **创建Java Bean**:定义一个Java类,包含你想要映射到XML的属性。这些属性将对应XML文档中的元素。 3...

    commons包介绍1

    2. **Betwixt**: Betwixt 提供了将JavaBean映射到XML文档和反向映射的功能,使得XML数据与Java对象之间的转换变得更加简单。 3. **Chain**: Chain组件实现了责任链模式,允许构建复杂的处理流程,其中每个处理者...

    javabean和xml互相转换工具类以及jar包

    - **使用第三方库,如Apache Commons Betwixt**:Betwixt是Apache Commons项目的一部分,提供了一种简单的机制来映射Java对象到XML和从XML到Java对象。在提供的`commons-betwixt-0.8.jar`中,包含了Betwixt库,可以...

    jar包介绍大全

    本文旨在为初学者详细介绍一些常用的jar包及其应用场景,帮助大家更好地理解和掌握这些重要的资源。 #### JTA (jta.jar) JTA (Java Transaction API) 是一个用于管理事务的标准接口,它定义了应用程序如何与事务...

Global site tag (gtag.js) - Google Analytics