在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
方法。 但是,我想要包括hashCode
, equals
和setter
方法。 生成代码时如何做到这一点?
在Java.net网站上,您将找到JAXB 2.x Commons项目 ,该项目提供了一组通用的JAXB
实用程序插件,其中包括4个应该解决您要实现的目标的插件:
- 等于插件
- HashCode插件
- Setters插件
- ToString插件
还有其他可用的插件,涵盖了Java
域对象的类似常见方面。
组态
从XML Schema
配置角度来看,您将添加如下所示的引用:
还有其他可用选项,例如定义在生成equals( that )
实现时应忽略的对象属性, toString()
实现等。
Java代码生成
从Java
角度来看,插件通常具有生成的类实现interface
; 例如,包含equals( that )
实现的生成类将实现Equals接口。
插件使用的设计方法通常会产生两种实现方式:
- 简单/标准实现,例如
equals( that )
方法(使用Equals Plugin
)。 - 一个更复杂的实现,包括
locator
和strategy
参数,允许您实现自定义处理(如果您愿意)。 对于这些,您将看到一个方法签名,例如:equals( thisLocator, thatLocator, that, strategy)
。
构建/运行
从运行时的角度来看,您必须包含JAXB2 Basics Runtime jar并提供选项参数,例如: -Xequals
, -XhashCode
或-XtoString
。 提供了使用Ant
和Maven
的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)
。
顺便说一下,为什么要以编程方式生成代码?