在 Java 中生成 JAXB 类时,添加到字符串、哈希码等于

2022-09-03 01:33:19

我正在尝试使用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);
    }
}

生成的类仅包含字段的方法。但是,我还想包括 和 方法。如何在生成代码时执行此操作?getterhashCodeequalssetter


答案 1

在GitHub网站上,您可以找到JAXB2 Basics项目,它提供了一组通用的实用程序插件,其中包括4个应该解决您尝试实现的目标:JAXB

  1. 等于插件
  2. 哈希码插件
  3. Setters Plugin
  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 代码生成

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

插件使用的设计方法通常生成 2 种实现方式:

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

构建/运行时

从运行时的角度来看,必须包括 JAXB2 Basics 运行时 jar 并提供选项参数,例如:、、 或 。如果您正在使用和 中的 JAXB2 基本信息来执行构建,则提供了使用 和 中的示例,并且 JAXB2 基本信息用户指南中提供了更多与构建相关的详细信息。-Xequals-XhashCode-XtoStringAntMaven


答案 2

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

除了@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)

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


推荐