在 Java 中生成 JAXB 类 时添加 toString、hashCode、equals
Add toString, hashCode, equals while generating JAXB classes in Java
我正在尝试使用 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
方法。如何在生成代码时做到这一点?
在 GitHub 网站上,您会找到 JAXB2 Basics project,它提供了一组通用的 JAXB
实用插件,其中包括 4 个可以解决您要实现的目标的插件:
还有其他可用的插件涵盖了 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] 接口。
插件使用的设计方法通常会产生两种实现方式:
- simple/standard 实现,例如
equals( that )
方法(使用 Equals Plugin
时)。
- 一个更复杂的实现,包括
locator
和 strategy
参数,允许您实现自定义处理(如果您愿意)。对于这些,您将看到一个方法签名,例如:equals( thisLocator, thatLocator, that, strategy)
.
Build/Runtime
从运行时的角度来看,您必须包含 JAXB2 Basics Runtime jar and provide option parameters such as: -Xequals
, -XhashCode
, or -XtoString
. There are examples provided for using the JAXB2 Basics from Ant
and Maven
, if you are using either of those to perform builds and more build-related details are provided in the JAXB2 Basics User Guide.
更新 下面的答案不正确。我被界面误导了,generateCode
目前确实没有对插件做任何事情。正如@Sidola 指出的那样,您应该改用 SchemaCompiler
。
除了@SeanMickey 的回答之外,我还将解决代码生成问题。
- 将 JAXB2-Basics JAR 添加到您的 class 路径。
- 实例化
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)
。
顺便问一下,为什么要以编程方式生成代码?
对我来说最简单的方法是使用 JAXB2 Basics Plugins:
- 加入pom.xml
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
- 添加插件
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<generateDirectory>target/generated-sources</generateDirectory>
<generatePackage>my.package</generatePackage>
</configuration>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-XtoString</arg>
<arg>-Xequals</arg>
<arg>-XhashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
在 mvn clean install
之后生成的 class 将类似于:
package my.package
public class MyClass implements Equals2, HashCode2, ToString2 {
}
来源: https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins
我正在尝试使用 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
方法。如何在生成代码时做到这一点?
在 GitHub 网站上,您会找到 JAXB2 Basics project,它提供了一组通用的 JAXB
实用插件,其中包括 4 个可以解决您要实现的目标的插件:
还有其他可用的插件涵盖了 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] 接口。
插件使用的设计方法通常会产生两种实现方式:
- simple/standard 实现,例如
equals( that )
方法(使用Equals Plugin
时)。 - 一个更复杂的实现,包括
locator
和strategy
参数,允许您实现自定义处理(如果您愿意)。对于这些,您将看到一个方法签名,例如:equals( thisLocator, thatLocator, that, strategy)
.
Build/Runtime
从运行时的角度来看,您必须包含 JAXB2 Basics Runtime jar and provide option parameters such as: -Xequals
, -XhashCode
, or -XtoString
. There are examples provided for using the JAXB2 Basics from Ant
and Maven
, if you are using either of those to perform builds and more build-related details are provided in the JAXB2 Basics User Guide.
更新 下面的答案不正确。我被界面误导了,generateCode
目前确实没有对插件做任何事情。正如@Sidola 指出的那样,您应该改用 SchemaCompiler
。
除了@SeanMickey 的回答之外,我还将解决代码生成问题。
- 将 JAXB2-Basics JAR 添加到您的 class 路径。
- 实例化
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)
。
顺便问一下,为什么要以编程方式生成代码?
对我来说最简单的方法是使用 JAXB2 Basics Plugins:
- 加入pom.xml
<dependencies>
<dependency>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</dependency>
- 添加插件
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.14.0</version>
<executions>
<execution>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<schemaDirectory>src/main/resources</schemaDirectory>
<generateDirectory>target/generated-sources</generateDirectory>
<generatePackage>my.package</generatePackage>
</configuration>
</execution>
</executions>
<configuration>
<extension>true</extension>
<args>
<arg>-XtoString</arg>
<arg>-Xequals</arg>
<arg>-XhashCode</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.11.1</version>
</plugin>
</plugins>
</configuration>
</plugin>
在 mvn clean install
之后生成的 class 将类似于:
package my.package
public class MyClass implements Equals2, HashCode2, ToString2 {
}
来源: https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins