如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件相关的知识,希望对你有一定的参考价值。
#0. 准备要转换的xml文件,在Project视界中,右击这个xml文件,在弹出的菜单上选择“Generate XSD schema from XML File...”, 按默认设置生成xsd文件。
将xsd 文件移至#1配置段的configuration/sources/source指定的路径下.
#1. 打开pom.xml, 加入下面的配置段.其中configuration节点中的内容依具体的项目不同而有不同的设定。一般而言,有3处设定:packageName,outputDirectory 和sources,
具体的官方说明文档,请参见:http://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.2/xjc-mojo.html
<build> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>jaxb2-maven-plugin</artifactId> <version>2.3.1</version> <executions> <execution> <id>xjc</id> <goals> <goal>xjc</goal> </goals> </execution> </executions> <configuration> <!-- The package of your generated sources, Jaxb会按这个Package的层次生成目录,并把Java类生成到这个Package中 --> <packageName>JaxbHelper.Entity</packageName> <!-- The path of your generated sources class, 输出Java类的根目录地址 --> <outputDirectory>D:\Git\zfq308\JaxbHelper\src\main\java\</outputDirectory> <sources> <!-- 此处为 xsd的路径, Sources节点下可以支持设定多个xsd文件 --> <source>D:\Git\zfq308\JaxbHelper\src\main\resources\FeedTestCase1.xsd</source> </sources> </configuration> </plugin> </plugins> </build>
#2. 在POM文件中加入#1所示的xml节点后,在Maven Projects视界窗口,找到你项目的节点,在Plugins节点下,
找到jaxb2节点,展开后,双击执行jaxb2:xjc 任务即可在指定的输出文件夹下生成相应的Entity.
#3. 将xml的数据通过jaxb载入成具体的类对象实例时,可采用下面的代码:本例中,TestSuitesType是xml的根节点。
import JaxbHelper.Entity.TestSuitesType; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException; import javax.xml.bind.Unmarshaller; import java.io.File; public class App { public static void main(String[] args) throws JAXBException { File file=new File("D:\\Git\\zfq308\\JaxbHelper\\src\\main\\resources\\FeedTestCase1.xml"); JAXBContext jaxbContext = JAXBContext.newInstance(TestSuitesType.class); Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); TestSuitesType testSuites = (TestSuitesType) jaxbUnmarshaller.unmarshal(file); Integer i=0; // 此行用于断点测试 } }
请注意:直接执行时,编译器编译通过,但运行时报:Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"TestSuites"). Expected elements are (none)的错误。
究其原因是因为Jaxb并不知道你所生成的这些Java类,谁是主节点。为此,需要在对应xml根节点的类里加入一个标注:@XmlRootElement(name="TestSuites")
加入前为:
@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "TestSuitesType", propOrder = {"testSuite"}) public class TestSuitesType { }
加入后为:
@XmlRootElement(name="TestSuites") @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "TestSuitesType", propOrder = {"testSuite"}) public class TestSuitesType { }
修改后即可正常使用。
#4. 如XML 有修改需要重新生成xsd、Java类等,可直接删除相应的xsd、java类和META-INF文件夹,必要时再删除target 目录,再重复#2-#3即可。
以上是关于如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 IntelliJ IDEA 和/或 Maven 以使用 jaxb2-maven-plugin 生成的 Java 源代码自动添加目录?
如何在一个Jaxb2Marshaller中处理更多的WSDL?
如何使用 jaxb2-maven-plugin 2.x 从 WSDL 生成 Java 类?