maven jaxb2 利用xsd生成Java class

阅读更多
本文介绍利用jaxb2-maven-plugin插件,直接从xsd文件生成对应的Java class。从而实现在webservice的开发中,能更方便的实现Java class和XML之间的转换。

1.创建xsd文件

	
		
			
				
				
			
		
	
	
		
			
				
				
			
		
	
	
		
			
			
		
	
	
		
			
			
			
		
	



2.编写pom.xml 文件


	4.0.0

	org.fengyilin
	xsdtojava
	0.1.0

    
        1.8
    
	
		

			
			
				org.codehaus.mojo
				jaxb2-maven-plugin
				1.6
				
					
						xjc
						
							xjc
						
					
				
				
					${project.basedir}/src/main/resources/ (1)
					${project.basedir}/src/main/java (2)
					false
				
			
			
		
	



(1)指定生成Java class所利用的xsd文件的位置,本例中需要把上文的hr.xsd文件放到/src/main/resources/ 目录下。
(2)指定生成文件的输出位置。

生成的Java class类package采用xsd文件中指定的schema的targetNamespace,本例中就是com.fengyilin.hr.schemas


工程目录如下:

maven jaxb2 利用xsd生成Java class_第1张图片

3.在工程的根目录下执行 mvn compile
执行完成后会在src/main/java/com/fengyilin/hr/schemas/ 下生成对应的Java class
执行后的工程目录如下:

maven jaxb2 利用xsd生成Java class_第2张图片


4.生成的代码列举:

//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//


package com.fengyilin.hr.schemas;

import java.math.BigInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * 

anonymous complex type的 Java 类。 * *

以下模式片段指定包含在此类中的预期内容。 * *

 * <complexType>
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="name" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         <element name="number" type="{http://www.w3.org/2001/XMLSchema}integer"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 
* * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "name", "number" }) @XmlRootElement(name = "HolidayResponse") public class HolidayResponse { @XmlElement(required = true) protected String name; @XmlElement(required = true) protected BigInteger number; /** * 获取name属性的值。 * * @return * possible object is * {@link String } * */ public String getName() { return name; } /** * 设置name属性的值。 * * @param value * allowed object is * {@link String } * */ public void setName(String value) { this.name = value; } /** * 获取number属性的值。 * * @return * possible object is * {@link BigInteger } * */ public BigInteger getNumber() { return number; } /** * 设置number属性的值。 * * @param value * allowed object is * {@link BigInteger } * */ public void setNumber(BigInteger value) { this.number = value; } }


//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//


package com.fengyilin.hr.schemas;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;


/**
 * 

anonymous complex type的 Java 类。 * *

以下模式片段指定包含在此类中的预期内容。 * *

 * <complexType>
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <all>
 *         <element name="Holiday" type="{http://fengyilin.com/hr/schemas}HolidayType"/>
 *         <element name="Employee" type="{http://fengyilin.com/hr/schemas}EmployeeType"/>
 *       </all>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 
* * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { }) @XmlRootElement(name = "HolidayRequest") public class HolidayRequest { @XmlElement(name = "Holiday", required = true) protected HolidayType holiday; @XmlElement(name = "Employee", required = true) protected EmployeeType employee; /** * 获取holiday属性的值。 * * @return * possible object is * {@link HolidayType } * */ public HolidayType getHoliday() { return holiday; } /** * 设置holiday属性的值。 * * @param value * allowed object is * {@link HolidayType } * */ public void setHoliday(HolidayType value) { this.holiday = value; } /** * 获取employee属性的值。 * * @return * possible object is * {@link EmployeeType } * */ public EmployeeType getEmployee() { return employee; } /** * 设置employee属性的值。 * * @param value * allowed object is * {@link EmployeeType } * */ public void setEmployee(EmployeeType value) { this.employee = value; } }


//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//


package com.fengyilin.hr.schemas;

import java.math.BigInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlType;


/**
 * 

EmployeeType complex type的 Java 类。 * *

以下模式片段指定包含在此类中的预期内容。 * *

 * <complexType name="EmployeeType">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="Number" type="{http://www.w3.org/2001/XMLSchema}integer"/>
 *         <element name="FirstName" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *         <element name="LastName" type="{http://www.w3.org/2001/XMLSchema}string"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 
* * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "EmployeeType", propOrder = { "number", "firstName", "lastName" }) public class EmployeeType { @XmlElement(name = "Number", required = true) protected BigInteger number; @XmlElement(name = "FirstName", required = true) protected String firstName; @XmlElement(name = "LastName", required = true) protected String lastName; /** * 获取number属性的值。 * * @return * possible object is * {@link BigInteger } * */ public BigInteger getNumber() { return number; } /** * 设置number属性的值。 * * @param value * allowed object is * {@link BigInteger } * */ public void setNumber(BigInteger value) { this.number = value; } /** * 获取firstName属性的值。 * * @return * possible object is * {@link String } * */ public String getFirstName() { return firstName; } /** * 设置firstName属性的值。 * * @param value * allowed object is * {@link String } * */ public void setFirstName(String value) { this.firstName = value; } /** * 获取lastName属性的值。 * * @return * possible object is * {@link String } * */ public String getLastName() { return lastName; } /** * 设置lastName属性的值。 * * @param value * allowed object is * {@link String } * */ public void setLastName(String value) { this.lastName = value; } }


//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//


package com.fengyilin.hr.schemas;

import java.util.Date;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;


/**
 * 

HolidayType complex type的 Java 类。 * *

以下模式片段指定包含在此类中的预期内容。 * *

 * <complexType name="HolidayType">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="StartDate" type="{http://www.w3.org/2001/XMLSchema}date"/>
 *         <element name="EndDate" type="{http://www.w3.org/2001/XMLSchema}date"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 * 
* * */ @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "HolidayType", propOrder = { "startDate", "endDate" }) public class HolidayType { @XmlElement(name = "StartDate", required = true) @XmlSchemaType(name = "date") protected Date startDate; @XmlElement(name = "EndDate", required = true) @XmlSchemaType(name = "date") protected Date endDate; /** * 获取startDate属性的值。 * * @return * possible object is * {@link Date } * */ public Date getStartDate() { return startDate; } /** * 设置startDate属性的值。 * * @param value * allowed object is * {@link Date } * */ public void setStartDate(Date value) { this.startDate = value; } /** * 获取endDate属性的值。 * * @return * possible object is * {@link Date } * */ public Date getEndDate() { return endDate; } /** * 设置endDate属性的值。 * * @param value * allowed object is * {@link Date } * */ public void setEndDate(Date value) { this.endDate = value; } }


Java中直接和xsd中xs:date对应的类型是XMLGregorianCalendar,无法在开发中使用,所以此处生成后手工替换成了实际开发中的类型java.util.Date

//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//


package com.fengyilin.hr.schemas;

import javax.xml.bind.annotation.XmlRegistry;


/**
 * This object contains factory methods for each 
 * Java content interface and Java element interface 
 * generated in the com.fengyilin.hr.schemas package. 
 * 

An ObjectFactory allows you to programatically * construct new instances of the Java representation * for XML content. The Java representation of XML * content can consist of schema derived interfaces * and classes representing the binding of schema * type definitions, element declarations and model * groups. Factory methods for each of these are * provided in this class. * */ @XmlRegistry public class ObjectFactory { /** * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: com.fengyilin.hr.schemas * */ public ObjectFactory() { } /** * Create an instance of {@link HolidayRequest } * */ public HolidayRequest createHolidayRequest() { return new HolidayRequest(); } /** * Create an instance of {@link HolidayType } * */ public HolidayType createHolidayType() { return new HolidayType(); } /** * Create an instance of {@link EmployeeType } * */ public EmployeeType createEmployeeType() { return new EmployeeType(); } /** * Create an instance of {@link HolidayResponse } * */ public HolidayResponse createHolidayResponse() { return new HolidayResponse(); } }


//
// 此文件是由 JavaTM Architecture for XML Binding (JAXB) 引用实现 v2.2.7 生成的
// 请访问 http://java.sun.com/xml/jaxb 
// 在重新编译源模式时, 对此文件的所有修改都将丢失。
// 生成时间: 2016.12.10 时间 07:16:22 PM CST 
//

@javax.xml.bind.annotation.XmlSchema(namespace = "http://fengyilin.com/hr/schemas", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package com.fengyilin.hr.schemas;


4.利用生成后的Java class实现和XML的转换
转换工具类:
package util;

import java.io.StringReader;
import java.io.StringWriter;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class JaxbUtil {

	public static String convertToXml(Object obj) {
		return convertToXml(obj, "UTF-8");
	}

	/**
	 * 将Java对象转换成对应的xml
	 * @param obj
	 * @param encoding
	 * @return
	 */
	public static String convertToXml(Object obj, String encoding) {
		String result = null;
		try {
			JAXBContext context = JAXBContext.newInstance(obj.getClass());
			Marshaller marshaller = context.createMarshaller();
			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
			StringWriter writer = new StringWriter();
			marshaller.marshal(obj, writer);
			result = writer.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 从xml转换成对应的Java object
	 * @param xml
	 * @param c
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static  T converToJavaBean(String xml, Class c) {
		T t = null;
		try {
			JAXBContext context = JAXBContext.newInstance(c);
			Unmarshaller unmarshaller = context.createUnmarshaller();
			t = (T) unmarshaller.unmarshal(new StringReader(xml));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t;
	}

}



Test类:
import java.util.Date;

import com.fengyilin.hr.schemas.EmployeeType;
import com.fengyilin.hr.schemas.HolidayRequest;
import com.fengyilin.hr.schemas.HolidayType;

import util.JaxbUtil;

public class Test {
	public static void main(String[] args) {
		HolidayRequest request = new HolidayRequest();
		EmployeeType employee = new EmployeeType();
		employee.setFirstName("feng");
		employee.setLastName("yilin");
		
		request.setEmployee(employee);
		
		HolidayType holiday = new HolidayType();
		holiday.setEndDate(new Date());
		holiday.setStartDate(new Date());
		
		request.setHoliday(holiday);
		
		System.out.println(JaxbUtil.convertToXml(request));
	}
}



执行结果:

    
        2016-12-10+08:00
        2016-12-10+08:00
    
    
        feng
        yilin
    


  • maven jaxb2 利用xsd生成Java class_第3张图片
  • 大小: 2.8 KB
  • maven jaxb2 利用xsd生成Java class_第4张图片
  • 大小: 7.6 KB
  • 查看图片附件

你可能感兴趣的:(maven,jaxb2,xsd,xml)