java - 在 Java 中生成 JAXB 类时添加 toString、hashCode、equals

标签 java jaxb xjc jaxb2-basics

我正在尝试使用 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 方法。但是,我还想包括 hashCodeequalssetter 方法。如何在生成代码时做到这一点?

最佳答案

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

  1. Equals Plugin
  2. HashCode Plugin
  3. Setters Plugin
  4. ToString Plugin

还有其他可用的插件涵盖了 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] 接口(interface)。

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

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

构建/运行时

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

关于java - 在 Java 中生成 JAXB 类时添加 toString、hashCode、equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334372/

相关文章:

java - 在对更新字段进行计算时更有效地更新表

Java JAXB 编码器更改 < 但不更改 > 的编码

java - JAXB 从 .xml 文件解码到 jlist

java - 使用 xjc 生成类文件时不支持绑定(bind)命名空间

java - 从 XSD 模式生成 Java 类

java - 带有枚举的 XML 模式

java - JAVA如何通过手工编码制作GUI?

java - 通过Spring框架获取依赖图(逆图)

java - jaxb 中的内联绑定(bind)规范

java - 是否有 UTF-8 无法识别的字节?