2

Web サービスに基づいて jaxws クライアントを生成しています。Jaxb は、プリミティブ型の代わりに java.lang.Boolean を使用してブール値を生成します。これに加えて、Bean の is() 命名規則を生成します。

ただし、ブール値 (isOptional() など) をチェックボックスにリンクしようとすると、次の例外がスローされます。

value="#{property.optional}": Property 'optional' not readable on type java.lang.Boolean

私のグーグルスキルは、jsfが以下でうまく動作することを私に知らせました:

 boolean isOptional()
 boolean getOptional()
 Boolean getOptional()

しかし、一緒ではありません

Boolean isOptional()

ただし、Web サービスのサイズと量が原因で Bean を手動で更新することは現実的ではないため、jsf で java.lang.Boolean isOptional() を適切に使用する方法はありますか? または、生成時に「getOptional()」を魔法のように生成するプロパティをjaxbバインディングファイルに定義することはできますか?

ちなみに、以下は機能します。

<h:selectBooleanCheckbox value="#{property.isOptional()}"/>

ただし、おそらくセッターが見つからないため、実際に値を更新することはできません。

編集:「java -version」の出力である最新のjdk 7を実行しています:

java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing)

「wsimport -version」の出力:

JAX-WS RI 2.2.4-b01

生成されたコード:

public Boolean isOptional() {
    return optional;
}
4

2 に答える 2

4

Jaxb は、プリミティブ型の代わりに java.lang.Boolean を使用してブール値を生成します。これに加えて、Bean の is() 命名規則を生成します。

isgetter 接頭辞を forに使用するjava.lang.Booleanことは、JAXB の既知の重大な誤りでした。2010 年 4 月にリリースされたバージョン 2.1.13 で修正されています。ライブラリを最新の状態に保ちます。

背景については、このブログ記事も参照してください。

JAXB API の大失敗

2006 年 9 月 15 日

これを台無しにしてしまったので、Sun に渡さなければなりません。ドキュメンテーションが教科書のように厚い場合、仕様に準拠しないソフトウェアを作成することはよくあることです。たとえば、W3C によって作成されたほぼすべてのものを考えてみましょう。ただし、それが自分の仕様に従うことができない場合、特にそれが最もよく知られている部分である場合、それは本当に悪いことです。そうです、Sun は JAXB 2.0 API を作成したとき、独自の仕様を 1 マイルも見逃していました。JAXB 2.0 コンパイラ (XJC) は、java.lang.Boolean プロパティの getter メソッドを生成するときに、「get」ではなく「is」という接頭辞を誤って使用します。JavaBean 仕様では、プリミティブ ブール値の読み取りメソッドは代替の "is" プレフィックスを使用できると述べていますが、この柔軟性は対応するブール値ラッパーには適用されません。

8.3.2 ブール値のプロパティ

さらに、ブール値のプロパティの場合、getter メソッドをパターンに一致させることができます。

public boolean is();

このisメソッドは、getメソッドの代わりに設けてもよいし、getメソッドに加えて設けてもよい。どちらの場合でも、ブール型プロパティに「is」メソッドが存在する場合は、「is」メソッドを使用してプロパティ値を読み取ります。

ブール型プロパティの例は次のとおりです。

public boolean isMarsupial();
public void setMarsupial(boolean m);

JAXB はコード生成フレームワークであり、コード生成フレームワークの背後にある考え方は、コードを「そのまま」使用し、その後は変更しないことであることを考えると、これはかなり大きな「おっと」です。この問題は報告されていますが、Sun からの応答は「申し訳ありませんが、遅すぎます」です。

この動作は仕様によって管理されており、残念ながら仕様を変更するには遅すぎます。

ユーザー エクスペリエンスに関しては、オート ボクシングのおかげで、これが人々にとって実際の問題になることはないと思います。Introspector を使用していて、プロパティが見つからないことが問題ですか? 遅すぎる?本当の問題ではありませんか?壊れてます。修理する!また、おそらくフレームワークには影響しないという素朴な発言も好きではありません。ええと、そうです、他のプロジェクトがたまたま仕様に準拠していたことを考えると (休止状態、春、myfaces など)。

更新: Stevo Slavic は、これが JAXB 2.1.13 で修正されたことを知らせてくれました。詳細については、 JAXB-131を参照してください。うん!

ここでは JSF/EL に問題はありません。JavaBeans 仕様に適切に準拠して仕事をしています。

于 2012-06-22T13:32:31.680 に答える
3

最新かつ最高の JAXB バージョンでも間違ったメソッドが生成される理由はわかりませんが、「-B-enableIntrospection」を追加して最終的に修正しました ( http://jaxb.java.net/2.2.4/docs/xjcに従って)。 .html ) を wsimport 呼び出しに追加します。これにより、次の結果が得られます。

public Boolean getOptional() {
    return optional;
}
于 2012-06-25T05:36:56.870 に答える