netty-JiBX的基本使用

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.xmldomain.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
}
发布了76 篇原创文章 · 获赞 66 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/u013887008/article/details/104203345
今日推荐