当前位置: 首页 > 面试题库 >

在Java中生成JAXB类时,添加toString,hashCode,等于

顾烨磊
2023-03-14
问题内容

我正在尝试使用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项目
,该项目提供了一组通用的JAXB实用程序插件,其中包括4个应解决您要实现的目标的插件:

  1. 等于插件
  2. HashCode插件
  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基本运行罐子,并提供选项参数,如:-Xequals-XhashCode,或-XtoString。从Ant和提供了使用JAXB2
Basics的示例Maven,如果您使用这两个示例执行构建,并且《JAXB2
Basics用户指南》中提供了更多与构建相关的详细信息。



 类似资料:
  • 我试图使用Java以编程方式从XSD文件生成JAXB类。我使用以下代码片段来实现这一点: 生成的类只包含字段的方法。但是,我还希望包括、和方法。如何在生成代码时做到这一点?

  • 我正在使用JAXB xjc命令行工具将XML模式(.xsd文件)转换为Java对象。 以下是我的.xsd文件的内容: 我无法修改原始的。xsd文件,我需要修改它才能用于多个尚未看到的。xsd文件。

  • 我一直在使用 annox 在我的 jaxb 生成的类上添加注释(通过绑定文件),但我找不到直接在包上添加注释的方法(包信息.java)。 我一直在尝试在bindings.xml中这样做: 但是jaxb抱怨说< code>annox:annotate不应该在那里。 还有别的方法吗?

  • 我在Jboss开发者工作室10.4和JDK 1.8中从xml模式定义文件生成JaxB类时得到了JAXBExc0019。 我是否缺少任何配置? [com.sun.xml.bind.v2.runtime.IllegalAnnotationsExceptions: 1次IllegalAnnotationExceptionscom.sun.xml.internal.bind.api.impl.NameCo

  • 问题内容: 我正在使用Java 6,JaxB 2和SpringSource Tool Suite(与Eclipse相同)。我编写了一些Java类,使用JaxB从中生成XML模式。但是,我注意到为了使用JaxB从Java对象生成XML文档的功能,我需要一个ObjectFactory。 如何生成ObjectFactory而不会浪费我现在已有的类? 问题答案: 更新 这个问题可能指的是创建一个角色的作用

  • 我有一个maven模型项目,我通过maven命令-clean install生成jaxb类,jaxb类在目标文件夹下生成,jar文件在目标文件夹下生成。m2存储库文件夹。 现在在我的另一个项目中,将这个jar添加为具有适当组id和artifactId的依赖项。 但我得到的是生成的jaxb类的ClassNotFoundException和编译错误。 我正在更新我的问题以添加更多细节。 模型项目的Po