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 Webサイトには、 JAXB 2.x Commonsプロジェクト があります。これは、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
の観点から、プラグインは通常、生成されたクラスにinterface
を実装させます。例として、equals( that )
実装を含む生成されたクラスは、 Equals インターフェースを実装します。
プラグインで使用される設計アプローチでは、通常、次の2種類の実装が生成されます。
equals( that )
メソッド(_Equals Plugin
_を使用する場合)などの単純な/標準の実装。locator
およびstrategy
パラメーターを含むより複雑な実装。これにより、カスタム処理を実装できます(必要な場合)。これらについては、equals( thisLocator, thatLocator, that, strategy)
などのメソッドシグネチャが表示されます。ランタイムの観点からは、 JAXB2 Basics Runtime jarを含め、_-Xequals
_、_-XhashCode
_、または_-XtoString
_などのオプションパラメーターを指定する必要があります。 Ant
およびMaven
からJAXB2の基本を使用するために提供されている例があります。これらのいずれかを使用してビルドを実行し、ビルド関連の詳細が JAXB2の基本)に記載されている場合ユーザーガイド 。
更新以下の答えは正しくありません。私はインターフェースに誤解されました。generateCode
は現時点ではプラグインに対して何もしません。 @Sidolaが指摘したように、代わりにSchemaCompiler
を使用する必要があります。
@SeanMickeyの回答に加えて、コード生成についても説明します。
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 を使用することです。
<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
生成されたクラスは次のようになります。
package my.package
public class MyClass implements Equals2, HashCode2, ToString2 {
}
ソウレ:https://github.com/highsource/jaxb2-basics/wiki/Using-JAXB2-Basics-Plugins