高效XML绑定框架JIBX

demo源码地址

https://gitee.com/clover-clover/clover.git

具体路径:

clover/clover-frame/clover-frame-netty/src/main/java/com/clover/frame/netty/http/xml/pojo

开发步骤

1-maven添加JIBX相关依赖

<!-- JiBx -->
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-extras</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-bind</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-tools</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-schema</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>org.apache.bcel</groupId>
<artifactId>bcel</artifactId>
<version>6.7.0</version>
</dependency>

2-编写POJO类

Shipping
public enum Shipping {
STANDARD_MAIL, PRIORITY_MAIL, INTERNATIONAL_MAIL, DOMESTIC_EXPRESS, INTERNATIONAL_EXPRESS
}
Address
public class Address {
private String name;
private String city; // setter and getter
}
Customer
public class Customer {
private long number;
private String firstName;
private String lastName;
private List<String> middleNames; // setter and getter
}
Order
public class Order {
private long number;
private Customer customer;
private Address billTo;
private Shipping shipping;
private Address shipTo;
private Float total; // setter and getter
}

3-使用ant来生成xml和POJO对象的绑定关系

IDEA如果没有ant窗口通过此方式添加:

在ant窗口点击【+】将build.xml添加到ant中,点击执行main任务即可。

如果在执行测试任务是,报错:如果报缺少 JiBX_bindingList,点击途中的bind即可解决。

binding.xml内容
<binding xmlns:ns1="http://clover.com/frame/netty/http/xml/pojo" name="binding" package="com.clover.frame.netty.http.xml.pojo">
<namespace uri="http://clover.com/frame/netty/http/xml/pojo" default="elements"/>
<mapping abstract="true" type-name="ns1:order" class="com.clover.frame.netty.http.xml.pojo.Order">
<value style="attribute" name="number" field="number"/>
<structure field="customer" usage="optional" name="customer">
<value style="attribute" name="number" field="number"/>
<value style="element" name="firstName" field="firstName" usage="optional"/>
<value style="element" name="lastName" field="lastName" usage="optional"/>
<collection field="middleNames" usage="optional" create-type="java.util.ArrayList">
<value name="middleName" type="java.lang.String"/>
</collection>
</structure>
<structure map-as="ns1:address" field="billTo" usage="optional" name="billTo"/>
<value style="element" name="shipping" field="shipping" usage="optional"/>
<structure map-as="ns1:address" field="shipTo" usage="optional" name="shipTo"/>
<value style="attribute" name="total" field="total" usage="optional"/>
</mapping>
<mapping class="com.clover.frame.netty.http.xml.pojo.Order" name="order">
<structure map-as="ns1:order"/>
</mapping>
<mapping abstract="true" type-name="ns1:address" class="com.clover.frame.netty.http.xml.pojo.Address">
<value style="element" name="name" field="name" usage="optional"/>
<value style="element" name="city" field="city" usage="optional"/>
</mapping>
</binding>
target中生成的class

JiBX_******.class类文件内容都空的

ant build.xml具体配置

build.xml配置文件中,bindgen任务需要特别注意,不要使用org.jibx.binding.BindingGenerator这个类,使用此类在后续的测试中发现有两个BUG:

集合属性报错-生成xml时

java.lang.String cannot be cast to org.jibx.runtime.IMarshallable

枚举属性报错-生成POJO对象时

该枚举没有可用的构造方法

<?xml version="1.0" encoding="utf-8"?>
<project default="main" basedir=".">
<path id="classpath">
<dirset dir="${basedir}/target/classes"/>
<!--下面目录为本地maven仓库的jibx和bcel的jar包的绝对路径-->
<fileset dir="/Users/zhangdq/.m2/repository/org/jibx/jibx-bind/1.4.2/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/org/jibx/jibx-run/1.4.2/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/org/jibx/jibx-tools/1.4.2/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/org/jibx/jibx-schema/1.4.2/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/org/apache/bcel/bcel/6.7.0/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/log4j/log4j/1.2.17/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/com/thoughtworks/qdox/qdox/1.12.1/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/org/apache/commons/commons-lang3/3.12.0/" includes="*.jar"/>
<fileset dir="/Users/zhangdq/.m2/repository/xpp3/xpp3/1.1.3.4.O/" includes="*.jar"/>
</path>
<!--这个是主任务 , depends 依赖下面写的三个分任务 -->
<target name="main" depends="compile,bindgen,bind" description="Main target"/>
<target name="compile" description="Compilation target">
<echo>Building file.</echo>
<!--相当于运行 javac命令进行源码编译-->
<javac srcdir="${basedir}/src/main/java/com/clover/frame/netty/http/xml/pojo/" destdir="${basedir}/target/classes" includeantruntime="true"/>
</target>
<target name="bindgen">
<echo message="Running BindGen tool"/>
<!--
相当于运行Java命令生成binding.xml文件 类似于网上说的如下命令 ->
java -cp ..libx-tools.jar ..BindGen -t 生成文件保存地址 -v 需要绑定文件的class文件 完整包名.类名
-->
<java classpathref="classpath" fork="true" failonerror="true" classname="org.jibx.binding.generator.BindGen">
<arg value="-s"/>
<arg value="src/main/java/"/>
<arg value="com.clover.frame.netty.http.xml.pojo.Order"/>
</java>
</target>
<target name="bind">
<!--将实体类的class和xml映射文件进行绑定-->
<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>

参考地址

https://blog.csdn.net/echohuangshihuxue/article/details/128653428

高效XML绑定框架JIBX的更多相关文章

  1. 使用高性能xml序列化框架jibx作为spring mvc的xml view

    package org.springframework.web.servlet.view.xml; import java.io.ByteArrayOutputStream; import java. ...

  2. FoxOne---一个快速高效的BS框架

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  3. FoxOne---一个快速高效的BS框架--WEB控件属性编辑器

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  4. FoxOne---一个快速高效的BS框架--(4)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  5. FoxOne---一个快速高效的BS框架--(2)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  6. FoxOne---一个快速高效的BS框架--数据访问(Dao)

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  7. FoxOne---一个快速高效的BS框架--生成增删改查

    FoxOne---一个快速高效的BS框架--(1) FoxOne---一个快速高效的BS框架--(2) FoxOne---一个快速高效的BS框架--(3) FoxOne---一个快速高效的BS框架-- ...

  8. Vue.js-----轻量高效的MVVM框架(七、表单控件绑定)

    话不多说,先上完整代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  9. Vue.js-----轻量高效的MVVM框架(六、Class与Style绑定)

    这个相对来说简单,看一遍代码就懂. 一.完整片段: <!DOCTYPE html> <html> <head> <meta charset="UTF ...

  10. IOS一些高效的第三方框架库

    MBProgressHUD ——进展指示符库 苹果的应用程序一般都会用一种优雅的,半透明的进度显示效果,不过这个API是不公开的,因此你要是用了,很可能被清除出AppStore.而 MBProgres ...

随机推荐

  1. 学习Java Day11

    今天学习了二维数组:

  2. 工控领域上云实践-Zstack和软赢

    工业以太网常见五大协议对比 大规模电机控制的方案选择-电机和驱动器篇 大规模电机控制的方案选择-控制器篇 工控领域有各种各样的总线来通讯以控制设备,很小众的接口规范慢慢的更小众了,最常见的接口规范就是 ...

  3. react中Hooks的理解和用法

    一.Hooks是什么? Hook 是 React 16.8 的新增特性.它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性 至于为什么引入hook,官方给出的动机是 ...

  4. 学习Vue过程中遇到的问题---code: 'MODULE_NOT_FOUND'

    在学习安装脚手架Vue-cli过程中 步骤为: 第一步(仅第一次执行):全局安装@vue/cli. npm install -g @vue/cli 第二步:切换到你要创建项目的目录,然后使用命令创建项 ...

  5. kali挂代理之——proxychains4

    记一次打站需要用到kali,但是得挂代理,就从别人那里知道了一个kali挂代理的工具proxychains4. 首先是打开kali输入:root@Kali:~# vi /etc/proxychains ...

  6. JZOJ 7339.改试卷

    \(\text{Solution}\) 又忘了线段树分治!! 显然维护一个上凸包 发现加点和删点可以变成限制存在时间 然后把点放在线段树上,线段树下标表示时间 加点时先把点按横坐标排序,然后就可以单调 ...

  7. ctf 菜鸟杯

    web签到 首先最里面的是ctfshow-QQ群:,而他需要进行cookie传参,因此我们需要在cookie传入CTFshow-QQ群=a,然后就要以POST方式传入a的值,我们传入a=b,而b是以G ...

  8. [POI2011]MET-Meteors 解题报告

    语言系统紊乱了 QAQ 这道题感觉不是很难鸭 qwq. 先只考虑一个国家,怎么做?很显然,就直接二分一下就行了.判定答案可以维护一个差分数组,然后最后对它做一个前缀和,再求一下这个国家的流行数量就好了 ...

  9. KMP字符串 AcWing 831

    题目:https://www.acwing.com/problem/content/833/ 题意:求子串在母串中每次出现时的下标位置. 题解:哈哈哈,敲题时想到之前看到一个人叫 kmp 算法为 看毛 ...

  10. 【RocketMQ】Dledger日志复制源码分析

    消息存储 在 [RocketMQ]消息的存储一文中提到,Broker收到消息后会调用CommitLog的asyncPutMessage方法写入消息,在DLedger模式下使用的是DLedgerComm ...