我正在尝试使用 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] 接口(interface)。
插件使用的设计方法通常会产生两种实现方式:
- 一个简单/标准的实现,例如
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 中提供了更多与构建相关的详细信息。
关于java - 在 Java 中生成 JAXB 类时添加 toString、hashCode、equals,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32334372/