15

我正在尝试使用 Java 以编程方式从 XSD 文件生成 JAXB 类。我使用以下代码片段来实现这一点:

....
import java.io.File;
import java.io.IOException;
import org.xml.sax.InputSource;
import com.sun.codemodel.JCodeModel;
import com.sun.tools.xjc.api.S2JJAXBModel;
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.XJC;
....
....
public static void generateJaxb(String schemaPath,
                                    String outputDirectory,
                                        String packageName) throws DataLoadingException
{
    try {
        // Setup schema compiler
        SchemaCompiler sc = XJC.createSchemaCompiler();
        sc.forcePackageName(packageName);

        // Setup SAX InputSource
        File schemaFile = new File(schemaPath);
        InputSource is = new InputSource(schemaFile.toURI().toString());

        // Parse & build
        sc.parseSchema(is);
        S2JJAXBModel model = sc.bind();

        JCodeModel jCodeModel = model.generateCode(null, null);
        jCodeModel.build(new File(outputDirectory));
    } catch (IOException exec) {
        LOGGER.error("Error while generating JAXB classes: " + exec);
    }
}

生成的类仅包含getter字段的方法。但是,我也想包括hashCode,equalssetter方法。在生成代码时如何做到这一点?

4

3 回答 3

15

在 GitHub 网站上,您会找到JAXB2 Basics 项目,它提供了一组通用的JAXB实用插件,包括 4 个应该解决您想要实现的目标:

  1. 等于插件
  2. 哈希码插件
  3. 设置器插件
  4. ToString 插件

还有其他可用的插件涵盖了Java域对象的类似共同方面。

配置

XML Schema配置的角度来看,您将添加如下所示的引用:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    xmlns:basic="http://jaxb2-commons.dev.java.net/basic"
    xmlns:equals="http://jaxb2-commons.dev.java.net/basic/equals"
    xmlns:hashCode="http://jaxb2-commons.dev.java.net/basic/hashCode"
    xmlns:toString="http://jaxb2-commons.dev.java.net/basic/toString"
    jaxb:extensionBindingPrefixes="basic equals hashCode toString">
    <!-- ... -->
</xs:schema>

equals( that )还有其他可用选项,例如定义在生成实现、toString()实现等时应忽略的对象属性。

Java 代码生成

从一个Java角度来看,插件通常让生成的类实现一个interface; 例如,包含equals( that )实现的生成类将实现 [Equals][6] 接口。

插件使用的设计方法通常会产生两种实现方式:

  1. 一个简单/标准的实现,例如equals( that )方法(使用 时Equals Plugin)。
  2. 包含locatorstrategy参数的更复杂的实现,它允许您实现自定义处理(如果您愿意)。对于这些,您将看到一个方法签名,例如:equals( thisLocator, thatLocator, that, strategy).

构建/运行时

从运行时的角度来看,您必须包含JAXB2 Basics Runtime jar 并提供选项参数,例如:-Xequals、、-XhashCode-XtoString。提供了使用 和 中的 JAXB2 Basics 的示例AntMaven如果您使用其中任何一个来执行构建,JAXB2 Basics User Guide中提供了更多与构建相关的详细信息。

于 2015-09-01T16:43:12.120 回答
4

更新下面的答案不正确。我被界面误导了,目前generateCode真的没有对插件做任何事情。正如@Sidola 指出的那样,您应该SchemaCompiler改用。

除了@SeanMickey 的回答,我还将讨论代码生成。

  • 将 JAXB2-Basics JAR 添加到您的类路径中。
  • 实例化
    • org.jvnet.jaxb2_commons.plugin.tostring.ToStringPlugin
    • org.jvnet.jaxb2_commons.plugin.equals.EqualsPlugin
    • org.jvnet.jaxb2_commons.plugin.hashcode.HashCodePlugin
    • org.jvnet.jaxb2_commons.plugin.setters.SettersPlugin
  • ...或任何你需要的东西。
  • 将插件传递给model.generateCode(plugins errorListener)作为第一个参数。

顺便说一句,为什么要以编程方式生成代码?

于 2015-09-01T21:31:44.750 回答
1

对我来说,最简单的方法是使用JAXB2 Basics Plugins

  1. 在 pom.xml 中添加<dependencies>
<dependency> 
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>
  1. 添加插件
<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
            <configuration>
                <schemaDirectory>src/main/resources</schemaDirectory>
                <generateDirectory>target/generated-sources</generateDirectory>
                <generatePackage>my.package</generatePackage>
            </configuration>
        </execution>
    </executions>
    <configuration>
        <extension>true</extension>
        <args>
            <arg>-XtoString</arg>
            <arg>-Xequals</arg>
            <arg>-XhashCode</arg>
        </args>
        <plugins>
            <plugin>
                <groupId>org.jvnet.jaxb2_commons</groupId>
                <artifactId>jaxb2-basics</artifactId>
                <version>0.11.1</version>
            </plugin>
        </plugins>
    </configuration>
</plugin>

生成的类之后mvn clean install会是这样的:

package my.package
public class MyClass implements Equals2, HashCode2, ToString2 {

}

来源: https ://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins

于 2019-07-31T12:13:48.457 回答