2

PeopleSoft が提供する WSDL からカスタム Java コードを生成しています。生成されたコードをクリーンアップして使いやすくするために、いくつかの XJC プラグインを作成しました (インターフェイスやカスタム メソッドの追加など)。

ただし、生成された例外クラスに共通のインターフェイスを追加したいのですが、プラグイン内にクラスが存在しないようです。

生成された Exception クラスは次のようになります。

public class M286565V1 extends Exception

それらはすべて同じ命名パターン (M の後に数字の文字列が続き、V1 で終わる) を持ち、すべて java.lang.Exception を拡張します。getFaultInfo()ただし、それらはすべて、インターフェースに追加したい共通のメソッド も持っています。

私のプラグインでは、によって提供されるすべてのクラスをループし、Outline.getClasses()java.lang.Exception を拡張するかどうかをそれぞれチェックします。

for ( ClassOutline classOutline : outline.getClasses() ) {
    final JDefinedClass implClass = classOutline.implClass;

    JClass superClass = implClass._extends();
    if ( superClass != null && superClass.fullName().equals( "java.lang.Exception" ) ) {
        //This class is an Exception class
    }
}

これにより、例外クラスが見つかりません。

私も名前でマッチングを試みました:

for ( ClassOutline classOutline : outline.getClasses() ) {
    final JDefinedClass implClass = classOutline.implClass;

    //Try to capture exception classes by name
    //Exception classes start with an M, followed by a number
    final String className = implClass.name();
    LOG.debug( "Checking class {}", className );
    if ( className.startsWith( "M" ) && Character.isDigit( className.charAt( 1 ) ) ) {
        //This class is an Exception class
    }
}

これも失敗し、ログ メッセージ ("Checking class…") には、最終的に生成される例外クラスが出力されません。

また、プロセスの後半で実行されるコードが役立つことを期待して、このコードをメソッドからプラグインrun()のメソッドに移動しようとしました。postProcessModel()これも失敗しました。

コードは期待どおりに実行されるので、プラグインの構成は正しいと確信しています。また、同じ方法で他のクラスをキャプチャして変更しました。実行時にモデルに例外がないように見えます。ただし、例外クラスは毎回正しく生成されます。

実行時に XJC プラグインからこれらのクラスをキャプチャする方法はありますか?

ご協力いただきありがとうございます。

4

1 に答える 1

1

タスクにJAXB2 Basics Inheritance プラグインを使用することを検討してください。(免責事項:私は著者です。)

実際にrunは、プラグインのメソッドでクラスを取得する必要があります。postProcessModellは適切な場所ではありません。早すぎます。後処理のためにモデルがロードされた後に呼び出されます。

デバッグすることをお勧めします。大きな問題なくテスト ケースから XJC を実行できます。たとえば、次のテストを参照してください。

https://github.com/highsource/jsonix-schema-compiler/blob/master/compiler/src/test/java/org/hisrc/jsonix/xjc/plugin/tests/JsonixPluginTest.java

お役に立てれば。

于 2015-03-24T12:56:28.407 に答える