学习netty的过程中无意中接触到jibx这个类库,但是网上一直没有基于maven项目和ant的完整的例子。
所以写下来给大家参考参考。
1 首先新建一个普通的maven项目 引入依赖
<dependency> <groupId>org.jibx</groupId> <artifactId>jibx-bind</artifactId> <version>1.2.6</version> </dependency> <dependency> groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency>
2 编写2个测试bean
public class Account { private int id; private String name; private String email; private String address; private Birthday birthday; //getter、setter @Override public String toString() { return this.id + "#" + this.name + "#" + this.email + "#" + this.address + "#" + this.birthday; }
public class Birthday { private String birthday; public Birthday(String birthday) { super(); this.birthday = birthday; } //getter、setter public Birthday() {} @Override public String toString() { return this.birthday; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } }
3 准备开始编写数据绑定关系了,
第一步是根据实体类生成binding.xml描述文件,这一步也可以手动自己写,主要是描述实体和xml的映射关系。
第二步是根据binding.xml编译生成中间操作类,实际上解码编码的时候都是用的生成的中间类,所以如果需要修改映射的时候也需要重新生成中间类.
ant文件如下,由于刚学ant,写的不好的地方多指教。主要是要在 compile编译的时候 指定destdir位子是maven项目的class位子。其中maven里面的jar文件路径自行修改下。
binggen是第一步,bind是第二步。生成好binding.xml后,第一步就不用每次都用ant编译了。
<?xml version="1.0" encoding="utf-8"?> <project default="main" basedir="."> <path id="classpath"> <dirset dir="${basedir}/target/classes" /> <dirset dir="${basedir}/target/test-classes" /> <fileset dir="D:/maven_repo/org/jibx/jibx-bind/1.2.6/" includes="*.jar" /> <fileset dir="D:/maven_repo/org/jibx/jibx-run/1.2.6/" includes="*.jar" /> <fileset dir="D:/maven_repo/bcel/bcel/5.1/" includes="*.jar" /> </path> <target name="main" depends="compile,binggen, bind" description="Main target" /> <target name="compile" description="Compilation target"> <echo>Building file.</echo> <javac srcdir="${basedir}/src/main/java" destdir="${basedir}/target/classes" includeantruntime="true" /> </target> <target name="binggen"> <echo message="Running BindGen tool" /> <java classpathref="classpath" fork="true" failonerror="true" classname="org.jibx.binding.BindingGenerator"> <arg value="com.keeley.Account" /> </java> </target> <target name="bind"> <echo message="Running bind" /> <taskdef name="bind" classname="org.jibx.binding.ant.CompileTask"> <classpath refid="classpath"/> </taskdef> <bind binding="${basedir}/binding.xml"> <classpath refid="classpath"/> </bind> </target> </project>
然后看target目录 应该多出很多 JiBX_开头的class文件。
4 编写测试类
public class JibxTest { private IBindingFactory factory = null; private StringWriter writer = null; private StringReader reader = null; private Account bean = null; @Before public void init() { bean = new Account(); bean.setAddress("北京"); bean.setEmail("email"); bean.setId(1); bean.setName("jack"); Birthday day = new Birthday(); day.setBirthday("2010-11-22"); bean.setBirthday(day); try { factory = BindingDirectory.getFactory(Account.class); } catch (JiBXException e) { e.printStackTrace(); } } @After public void destory() { bean = null; try { if (writer != null) { writer.flush(); writer.close(); } if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } @Test public void bean2XML() { try { writer = new StringWriter(); // marshal 编组 IMarshallingContext mctx = factory.createMarshallingContext(); mctx.setIndent(2); mctx.marshalDocument(bean, "UTF-8", null, writer); fail(writer); reader = new StringReader(writer.toString()); //unmarshal 解组 IUnmarshallingContext uctx = factory.createUnmarshallingContext(); Account acc = (Account) uctx.unmarshalDocument(reader, null); fail(acc); } catch (Exception e) { e.printStackTrace(); } } public void fail(Object o) { System.out.println(o); } public void failRed(Object o) { System.err.println(o); } }
5 运行junit之后的文件大概是这样的
<?xml version="1.0" encoding="UTF-8"?> <account id="1"> <name>jack</name> <email>email</email> <address>北京</address> <birthday> <birthday>2010-11-22</birthday> </birthday> </account>
id给自动弄成属性了,如果想改成子节点,修改 binding.xml 文件
usage="optional" 这个代表属性是可选的 不是必须的。
在 <value name="id" field="id"/> 上面 加上属性 style="element" 就可以了。
然后重新运行 ant bind就好了(去掉 ant中的第一步 binggen)
参考了一下文章 http://www.cnblogs.com/hoojo/archive/2011/04/27/2030205.html