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

我正在尝试使用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方法。 生成代码时如何做到这一点?

在Java.net网站上,您将找到JAXB 2.x Commons项目 ,该项目提供了一组通用的JAXB实用程序插件,其中包括4个应该解决您要实现的目标的插件:

  1. 等于插件
  2. HashCode插件
  3. Setters插件
  4. ToString插件

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

组态

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

     

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

Java代码生成

Java角度来看,插件通常具有生成的类实现interface ; 例如,包含equals( that )实现的生成类将实现Equals接口。

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

  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中提供了更多与构建相关的详细信息。

更新以下答案不正确。 我被界面误导了, 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)作为第一个参数传递给model.generateCode(plugins errorListener)

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