web-dev-qa-db-ja.com

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メソッドのみが含まれます。ただし、hashCodeequals、およびsetterメソッドも含めたいと思います。コードの生成中にそれを行う方法は?

12
Arka Ghosh

Java.net Webサイトには、 JAXB 2.x Commonsプロジェクト があります。これは、JAXBユーティリティプラグインの共通セットを提供します。これには、目的に対応する4つが含まれます。成し遂げる:

  1. プラグインと等しい
  2. HashCodeプラグイン
  3. セッタープラグイン
  4. ToStringプラグイン

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 インターフェースを実装します。

プラグインで使用される設計アプローチでは、通常、次の2種類の実装が生成されます。

  1. equals( that )メソッド(_Equals Plugin_を使用する場合)などの単純な/標準の実装。
  2. locatorおよびstrategyパラメーターを含むより複雑な実装。これにより、カスタム処理を実装できます(必要な場合)。これらについては、equals( thisLocator, thatLocator, that, strategy)などのメソッドシグネチャが表示されます。

ビルド/ランタイム

ランタイムの観点からは、 JAXB2 Basics Runtime jarを含め、_-Xequals_、_-XhashCode_、または_-XtoString_などのオプションパラメーターを指定する必要があります。 AntおよびMavenからJAXB2の基本を使用するために提供されている例があります。これらのいずれかを使用してビルドを実行し、ビルド関連の詳細が JAXB2の基本)に記載されている場合ユーザーガイド

11
Sean Mickey

更新以下の答えは正しくありません。私はインターフェースに誤解されました。generateCodeは現時点ではプラグインに対して何もしません。 @Sidolaが指摘したように、代わりにSchemaCompilerを使用する必要があります。

@SeanMickeyの回答に加えて、コード生成についても説明します。

  • JAXB2-BasicsJARをクラスパスに追加します。
  • インスタンス化
    • _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)に渡します。

ちなみに、なぜプログラムでコードを生成したいのですか?

4
lexicore

私にとって最も簡単な方法は、 JAXB2 Basics Plugins を使用することです。

  1. Pom.xmlを追加します<dependencies>
<dependency> 
    <groupId>org.jvnet.jaxb2_commons</groupId>
    <artifactId>jaxb2-basics</artifactId>
    <version>0.11.1</version>
</dependency>
  1. プラグインを追加します
<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

1
Ermal