2009-08-01 10 views
0

私のプロジェクトでは、JSF 1.2とJBOSS 5を使用してプロジェクトを開発しました。新しい要件の一部として、Websphere 7に移行する必要があります。しかし、私は、JavaランタイムWASによって内部的に使用されています。 autobox int/Integersにはできません。暗黙のうちに文字列をlong型にキャストします。最終的に必要なチェックを行った後、次の検証例外が発生しました。Websphere 7 JSF

/Star/employeeFormP1.jsp(226,4) '#{StarEmployeeApplicationFormBean.medicalHMO}'クラスに 'medicalHMO'プロパティを設定できません'com.idea.app.bean.StarEmployeeApplicationFormBean'を 'true'に設定します。

関連する次のコード:

<h:selectBooleanCheckbox id="checkbox1" 
     value="#{StarEmployeeApplicationFormBean.medicalHMO}" 
     title="click it to select or deselect" 
     immediate="true" 
     valueChangeListener="#{StarEmployeeApplicationFormBean.listHMOMedProducts}" 
     onchange="return submit()" /> 

誰もがこの検証例外に私を助けていただけますか?

+0

StarEmployeeApplicationFormBean.medicalHMOのゲッター/セッターのタイプは何ですか? – McDowell

+0

@McDowell beanのmedicalHMO属性はString型です。私はそれがselectBooleanCheckboxのブール値でなければならないが、すべての開発者はそうではないことを知っている。 :P これをブール値に変更すると、そのトリックが実行されました。しかし、不思議なことに、問題なくJBossで正常に動作していました。値は文字列として "true"/"false"として設定されていました。それがJBossでうまくいく理由についての手掛かりはありますか? JSFの異なるバージョンが関係していますか? – Barun

答えて

1

のJBoss 5とWebSphere 7はJEE5サーバーなので、JSF 1.2のインプリメントでは、プラットフォームによって提供されるEL実装だけが使用されます。型の強制のためのルールthe JSP 2.1 specに詳述されている:

たとえば、Stringにint型を強制する場合は、「ボックス」int型整数に変換し、整数を文字列に強制変換のルールを適用します。または、Stringをdoubleに強制する場合は、StringをDoubleに強制的に適用するルールを適用し、結果のDoubleを「unbox」し、結果のDoubleが実際にはnullでないことを確認します。

仕様に詳述されているルールに基づいて、WebSphere実装のバグのようです。この問題に対処する既存のAPAR/Fix Packが見つからない場合は、報告したいと思います。

0

問題の原因がわかりません。 "それはAutoBoxのint型/整数にできません... ..."

  1. - Googleはそれが7はJDK 5、which does autoboxingを使用してWAS私に語った:私はいくつかのコメントがあります。アプリケーションサーバーが正しいバージョンのJVMを使用していることを確認する必要があります。
  2. "...文字列をlongに暗黙にキャスト..." - 私はこれを行うJVMはないと思います。

    /Star/employeeFormP1.jsp(226,4) 「#{} StarEmployeeApplicationFormBean.medicalHMO:

それは最終的に私は検証例外次 で立ち往生していますのために必要なチェック を提供した後' クラスのプロパティ' medicalHMO 'を ' com.idea.app.bean.StarEmployeeApplicationFormBean ' に' true 'を設定できません。

いくつかのコードを投稿することなく伝えるのは難しいです。

+0

私は、ポスターが、EL型強制や、JSF実装の内部リフレクションのプラットフォームサポートを参照していると思われます。 – McDowell

0

WAS 7.0は実際にJDK 1.6を使用し、WAS 6.1はJDK 1.5を使用します。

オートボクシングは私の作品、Integer型にint型など

私は、プリミティブ型の変換にコメント、文字列に同意する「オートボクシング」の一部ではありません。

medicalHMOのセッターがあなたの問題の鍵です。どんなタイプがありますか?

場合など、ために、あなたが持っているsetMedicalHMO(文字列newValueに){...}

別のセッターsetBooleanMedicalHMO(ブール値newValueに)を追加しても面白いかもしれませんの{...}

0

これは、IBM JVMを使用している可能性があります。私はバグに気づきましたが、==を使用してintをlongと同じ値で比較し、falseを返します。この方法を使用して例えば

は、:

public boolean amIEqual(int myInt, long myLong){ 
    return myInt == myLong; 
} 

amIEqual(3,3)

は私が使っていたIBM JVM上 falseました。

public boolean amIEqual(Integer myInt, Long myLong){ 
    return myInt.equals(myLong); 
} 

今、amIEqual(3,3)が突然trueになった:

は、この問題を解決するために、私は明示的にオブジェクト・タイプを使用しました。

関連する問題