3

私は注釈の使用シナリオに少し行き詰まっており、あなたの意見を期待していました。

次の注釈 ( ExistingCustomerValidatorクラスと共に同じプロジェクトで定義) を指定すると、パッケージ com.tktserver.constraints;

@Target({ ElementType.TYPE, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { ExistingCustomerValidator.class })
@Documented
public @interface ExistingCustomerMatch {
    String message() default "{customer.notfound}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    /**
     * @return The field
     */
    String field();
}

および次の jxb カスタマイズ

<jaxb:bindings node="xsd:complexType[@name='customer']">
    <annox:annotate>
        <annox:annotate
            annox:class="com.tktserver.constraints.ExistingCustomerMatch"
            field="electronicUserId" />
    </annox:annotate>
</jaxb:bindings>

Maven を介してソースを生成すると、これが得られます (プロジェクト全体が Maven によって処理されます)。

Caused by: org.jvnet.annox.annotation.AnnotationClassNotFoundException: Annotation class [com.tktserver.constraints.ExistingCustomerMatch] could not be found.
    ... 32 more
Caused by: java.lang.ClassNotFoundException: com.bgc.ticketserver.constraints.ExistingCustomerMatch
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at org.jvnet.annox.parser.XAnnotationParser.parse(XAnnotationParser.java:76)
    ... 31 more

他の JSR-303 アノテーションは正常に動作するようです。私が疑問に思っているのは、ここで循環依存関係に陥っているのか、つまり、generate-sources が最初に実行されてからコンパイルされるのか、したがって、generate-sources の実行時に利用できる ExistingCustomerMatch 注釈クラスがないのか、それともこれがまったく別の獣なのかということです。

ありがとう、イオアニス

4

2 に答える 2

2

maven.compile.classpathに対してorg.jvnet XJC2Taskでmavenのantrunプラグインを使用して、annox JAXBプラグインをxjcで動作させました。( http://confluence.highsource.org/display/J2B/JAXB2+Basics+XJC+Ant+Taskを参照) ストレートな Maven プラグインで動作させることはできませんでした。

しかし、それが私がここに書きに来た理由ではありません。ここにたどり着いたのは、あなたが Google 検索で非常に賢く、この annox を介して、現在の JAXB 地獄から抜け出すことを固く決意しているからだと思います。謙虚にあなたに手紙を書きます。私は何度も何度もあなたと一緒にいました。そして、今日私はあなたに言いたくて手紙を書いています :

私のアドバイスは、生成された JAXB Bean に annox などを介してアノテーションを追加したいという個人的な「xsd-to-jaxb-beans へのコンパイル」の冒険のポイントに到達した人向けです。そこにいる場合は、XSD の制限によって制約を受けて身動きが取れなくなっていると感じているか、XSD が制御不能になっている可能性があります。

XML スキーマを JAXB Bean に構築するという私の経験は、最初はかなり良かったです。すべての pojo が表示され、スキーマがすべて異なる名前空間で適切にファクタリングされ、1 つのマスター XSD にインポートされたのを見るのは満足のいくものでした。私のビルドは本当に明確でした。どこにでも Javadoc ドキュメント タグを追加しようとしていることに気付き、XSD はますます複雑になっていました。しかし、生成された Bean は非常に見栄えがよく、契約から無料の Javadoc を取得しました。私はいくつかの JAXB アノテーション (主に @XMLTransient) を入れなければなりませんでした。私が maven で annox を動作させる唯一の方法は、ハッキーな Ant タスクで antrun プラグインを使用することでした。なぜこれらのことがうまくいかないのでしょうか??

その後、要件がますます厳しくなり、スキーマ設計をますます厳しくする必要があり、XSD のハッキングにますます多くの時間を費やしていました - 限界点まで: EclipseLink MOXy を使用して JSON にマーシャリングできるようにする必要があり、突然私のスキーマがそのプレッツェルにひねられず、見栄えの良い JSON と XML の両方を取得できます。私は立ち往生しました、そして長い間。

専門家に相談したところ、スキーマから JAXB Beans への取り組みを完全にやめるように言われました。正しい方法は、JAXB Bean を JAXB および MOXy アノテーションで手書きし、schemagen を使用して .xsd を生成することでした。違う方向に行く!? 出来た。schemagen で生成された .xsd はきれいではありませんでしたが、どうでもいいことです。スキーマはビーンごとに正しく、XML を解析したときにすべて機能し、MOXy を使用してビーンを JSON にマーシャリングできました。

コードを変換するために、手書きのスキーマから生成したオリジナルの JAXB Bean を出発点として使用したので、ゼロから始める必要さえありませんでした。実際、生成した JAXB Bean の半分以上を捨てました。それらは不必要でした (xjc は大量の使い捨てクラスを生成します。) 最良の部分は、MOXy アノテーションに精通していることです。すべてのプロバイダーとして MOXy を使用し、組み込みの Oracle JAXB impl の使用を完全に停止します。MOXy は JAXB の未来です。

だから、これが XJC を機能させようとしている貧しい魂に届くことを願っています。プレッツェルのねじれに苦しむのをやめてください. 変更を加えるのにそれほど時間はかかりません。ただ実行してください。

于 2014-09-24T17:58:24.710 に答える