如何从XSD创建POJO类?

20

我正在使用Spring Maven插件,我想从特定文件夹中指定的xml模式创建POJO类。我尝试通过java代码使用xjc命令,但它没有生成这些类。其次,我尝试使用jaxb,但它处理的是xml文件,而不是xsd模式进行编组/解组。我认为这不是从创建POJO的方法。

在Java中生成来自XSD的类的正确方法是什么?

以下是XSD:

   <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="Employee">
   <xs:complexType>
   <xs:sequence>
    <xs:element name="empId" type="xs:long"/>
    <xs:element name="lastName" type="xs:string"/>
    <xs:element name="title" type="xs:string"/>
    <xs:element name="salary" type="xs:integer"/>
    <xs:element name="address">
    <xs:complexType>
       <xs:sequence>
         <xs:element name="city" type="xs:string"/>
         <xs:element name="street" type="xs:string"/>
         <xs:element name="zipcode" type="xs:integer"/>
         <xs:element name="privatePhoneNo">
           <xs:complexType>
             <xs:sequence>
                 <xs:element name="privateMobile" type="xs:string"/>
                 <xs:element name="privateLandline" type="xs:string"/>
             </xs:sequence>
           </xs:complexType>
         </xs:element>
        </xs:sequence>
     </xs:complexType>
    </xs:element>
 </xs:sequence>
 </xs:complexType>
 </xs:element>
 </xs:schema>

1
我们在生产代码中使用一个叫做XMLBeans的工具。它已经被弃用,但是对我们来说运作良好。 - Tim Biegeleisen
请问您能否再详细解释一下,如何使用它? - Chaitanya Ghumare
@Andreas 是的,我会修改我的问题,它应该在构建时生成。我已经尝试使用xjc,当我手动在cmd上执行该命令时,它可以工作,但是通过Java代码它没有生成那些类。 - Chaitanya Ghumare
使用JAXB插件,您的IDE可以(而且必须)自动生成来自XSD的类... http://www.javaworld.com/article/2071784/enterprise-java/java-xml-mapping-made-easy-with-jaxb-2-0.html - Jordi Castilla
是的,@Bikram Kundu,实际上我不知道如何通过Java代码使用JAXB来创建POJO,我不想手动创建JAXB项目,然后使用IDE的生成POJO函数。我正在添加XSD。 - Chaitanya Ghumare
显示剩余7条评论
4个回答

31

我的建议是使用 JAXB

我在 eclipse 中进行了测试,对我来说效果很好。我的建议是尝试使用 命令行 或在 eclipse 的帮助下生成 POJO。一旦成功,使用 maven 配置它以在构建时生成 POJO。

有几个教程可供学习,请根据您的喜好按以下链接进行:

还有一些 YouTube 链接:

希望这有所帮助!

如果您遇到任何问题,请随时留言。


是的,我已经经历了这一切。我不想手动创建那些类,也不想通过cmd来创建。它应该从Java代码中生成,我正在使用Spring。实际上,如果我们的XSD文件相同,则运行良好,但在我的情况下,XSD文件会不时更改,用户会给我们一个XSD文件,从而我想要创建类,因此我不想手动生成它。是否有其他方式?我们能否通过Spring运行那个cmd命令? - Chaitanya Ghumare
我已经提到了如何使用Maven在构建时实现它,这应该会对你有所帮助。请查看第三个链接!我不认为你可以在运行时实现它,至少我不知道有任何类似的东西! - SyntaX
在第三个链接中,我们需要配置包路径和文件,然后它将在构建时生成这些类。但是是否有其他方法可以在不使用插件的情况下进行配置? - Chaitanya Ghumare
它对我有所帮助,但我的要求有点不同,我想从用户那里获取XSD文件,而不是在插件中进行配置。因此,我尝试通过Java代码运行XJC命令,但那并没有起作用。 - Chaitanya Ghumare
1
谢谢您提供的第三个链接 :) 正是我所需要的。 - Rishi
显示剩余2条评论

8

jaxb2-maven-plugin

使用jaxb2-maven-plugin是最简单的方法。定义插件如下:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>jaxb2-maven-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <goals>
                        <goal>xjc</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <schemaDirectory>${project.basedir}/src/main/xsd/</schemaDirectory>
                <schemaFiles>MARC21slim.xsd</schemaFiles>
            </configuration>
        </plugin>
    </plugins>
</build>

并执行:

mvn jaxb2:xjc

生成的文件将位于target\generated-sources\jaxb

非常简单。谢谢伙计。 - Soufian Aboulfaouz

6

.xsd文件转换为Java文件的一种简单方法是使用xjc工具。只需在相同的工作目录中执行以下命令:

xjc test.xsd

这是一个 xjc 的示例:https://thoughts-on-java.org/generate-your-jaxb-classes-in-second/ - DOKKA

2

jaxb2-maven-plugin版本2改变了配置方式。

以下命令将在src/main/resource中的所有内容上运行xjc,并将其放入com.yourcompany.xsd中。

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>jaxb2-maven-plugin</artifactId>
    <version>2.5.0</version>
    <executions>
        <execution>
            <goals>
                <goal>xjc</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <sources>
            <source>src/main/resources</source>
        </sources>
        <packageName>com.yourcompany.xsd</packageName>
    </configuration>
</plugin>

查看https://www.mojohaus.org/jaxb2-maven-plugin/Documentation/v2.5.0/example_xjc_basic.html中的隐式行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接