netty-JiBX的基本使用
JiBX是用户XML数据绑定的框架,实现数据对象与XML文件之间的转换
JiBX流程
- 首先通过POJO对象生成绑定文件(
binding.xml
)和 Schema 文件 - 然后根据绑定文件和POJO对象的映射关系各规则动态的修改POJO类
准备
现有 pojo 为 Order :
public class Order {
private long orderNumber;
private Customer customer;
private Address billTo;
private Shipping shipping;
private Address shipTo;
private Float total;
}
通过命令行生成绑定文件
- 下载 jibx_1_3_3.zip 的压缩包并解压
- 进入maven工程的
target/class
目录,打开 cmd 并执行以下命令
# java -cp jibx-tools.jar路径
# org.jibx.binding.generator.BindGen
# -b binding.xml -t 要生成binding文件的目录 Pojo类的全类名
java -cp E:\jibx_1_3_3_2\jibx\lib\jibx-tools.jar
org.jibx.binding.generator.BindGen
-b binding.xml com.http.domain.Order
如果不指定生成的绑定文件的路径的话,默认是在 target/class/jibx/
目录下,如果不指定生成绑定文件名称的话,默认是 binding.xml
通过应用程序
现有工具类 JibxUtil
:
public class JiBxUtil {
public static void main(String[] args) throws Exception {
String bindFileName = "binding.xml";
String bindFileOutPath = System.getProperty("user.dir")
+ "/netty-sample/src/main/resources/jibx/";
// String schema = "com.chap10.http.domain.Order";
// bindingFileGen(bindFileName, bindFileOutPath, schema);
bindCompile(bindFileOutPath + "/" + bindFileName);
}
/**
* 生成绑定xml文件
* @param bindFileName 绑定文件名称
* @param bindFileOutPath 生成绑定文件目录(绝对路径) /src/main/resources/jibx
* @param schema 一般是pojo的全类名 com.chap10.http.domain.Order
* @throws Exception
*/
public static void bindingFileGen(String bindFileName, String bindFileOutPath,
String schema) throws Exception {
String[] args = new String[9];
//生成pojo路径
args[0] = "-s";
args[1] = "src";
//binding文件名称
args[2] = "-b";
args[3] = bindFileName;
// 打印生成过程的一些信息
args[4] = "-v";
// 如果目录已经存在,就删除目录
args[5] = "-w";
//指定xml和xsd输出路径 绝对路径
args[6] = "-t";
args[7] = bindFileOutPath;
//schema,完整类名
args[8] = schema;
BindGen.main(args);
}
/**
* 生成动态绑定类
* @param bindFileName 绑定文件名称(绝对路径)
*/
public static void bindCompile(String bindFileName) {
String[] args = new String[2];
// 打印生成过程的详细信息
args[0] = "-v";
// 指定 binding 文件
args[1] = bindFileName;
Compile.main(args);
}
}
执行 bindingFileGen
方法,可以在 src/main/resources/jibx
目录下看到两个文件: binding.xml
和 domain.xsd
(这个应该是类所在的父目录名称.xsd)
生成动态修改class文件
通过应用程
执行 bindCompile
方法,可以在这个 pojo类所在的 package 下多出了以 JiBX打头的类:
通过jibx-maven-plugin
添加插件:
# version为1.3.3的时候,goal为bind报错....!!!!
<plugin>
<groupId>org.jibx</groupId>
<artifactId>jibx-maven-plugin</artifactId>
<version>1.3.1</version>
<configuration>
<schemaBindingDirectory>
${basedir}/netty-sample/src/main/resource/jibx
</schemaBindingDirectory>
<includeSchemaBindings>
<includeSchemaBindings>*binding.xml</includeSchemaBindings>
</includeSchemaBindings>
<verbose>true</verbose>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>bind</goal>
</goals>
</execution>
</executions>
</plugin>
运行 mvn jibx:bind
, 貌似没有生成以 JiBx
打头的类…
Jibx的类库使用
引入依赖
<!-- jibx-->
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-run</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-extras</artifactId>
<version>1.3.1</version>
</dependency>
<!-- jibx bind gen-->
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-bind</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.jibx</groupId>
<artifactId>jibx-tools</artifactId>
<version>1.3.1</version>
</dependency>
public class OrderFactory {
public static Order createOrder(long orderId) {
Order order = new Order();
order.setOrderNumber(orderId);
Customer customer = new Customer();
customer.setCustomerNumber(orderId);
customer.setFirstName("netty");
customer.setLastName("definitive");
order.setCustomer(customer);
Address address = new Address();
address.setStreet1("Sh No.1 avenue");
address.setStreet2("Hai No2 street");
address.setCity("ShangHai");
address.setState("徐汇区");
address.setPostCode("10086");
address.setCountry("China");
order.setBillTo(address);
order.setShipping(Shipping.DOMESTIC_EXPRESS);
order.setShipTo(address);
order.setTotal(1000.5f);
return order;
}
}
测试类:
public class OrderTest {
private static final String CHARSET = "UTF-8";
private IBindingFactory factory;
private StringWriter writer;
private StringReader reader;
private String encode2Xml(Order order) throws Exception{
factory = BindingDirectory.getFactory(Order.class);
writer = new StringWriter();
IMarshallingContext mctx = factory.createMarshallingContext();
mctx.setIndent(2);
mctx.marshalDocument(order, CHARSET,null, writer);
String xml = writer.toString();
writer.close();
System.out.println(xml.toString());
return xml;
}
private Order decode2Order(String xml) throws Exception{
reader = new StringReader(xml);
IUnmarshallingContext umctx = factory.createUnmarshallingContext();
return (Order)umctx.unmarshalDocument(reader);
}
public static void main(String[] args) throws Exception{
Order order = OrderFactory.createOrder(100L);
OrderTest orderTest = new OrderTest();
String xml = orderTest.encode2Xml(order);
Order orderDec = orderTest.decode2Order(xml);
System.out.println(orderDec);
}
}
运行结果:
<?xml version="1.0" encoding="UTF-8"?>
<order xmlns="http://com/chap10/http/domain" orderNumber="100" total="1000.5">
<customer customerNumber="100">
<firstName>netty</firstName>
<lastName>definitive</lastName>
</customer>
<billTo>
<street1>Sh No.1 avenue</street1>
<street2>Hai No2 street</street2>
<city>ShangHai</city>
<state>徐汇区</state>
<postCode>10086</postCode>
<country>China</country>
</billTo>
<shipping>DOMESTIC_EXPRESS</shipping>
<shipTo>
<street1>Sh No.1 avenue</street1>
<street2>Hai No2 street</street2>
<city>ShangHai</city>
<state>徐汇区</state>
<postCode>10086</postCode>
<country>China</country>
</shipTo>
</order>
Order{
orderNumber=100,
customer=Customer{
customerNumber=100,
firstName='netty',
lastName='definitive',
middleNames=null
},
billTo=Address{
street1='ShNo.1avenue',
street2='HaiNo2street',
city='ShangHai',
state='徐汇区',
postCode='10086',
country='China'
},
shipping=DOMESTIC_EXPRESS,
shipTo=Address{
street1='ShNo.1avenue',
street2='HaiNo2street',
city='ShangHai',
state='徐汇区',
postCode='10086',
country='China'
},
total=1000.5
}
注意事项
可能会遇到这样的问题:
Exception in thread "main" java.lang.IllegalStateException: Internal error: unable to find class Set ...
坑在这里了,问题就是jdk的版本,我设置jdk版本为1.8没有问题,设置jdk1.9或者更高的时候,就会出现这样的问题