2012-07-25 15 views
8

JSF 2.0、JBoss 7.1.1 Finalで作業しています。selectOneMenuに次の問題があります。マネージドBeanのフィールドをtrue/false/nullに設定できます。h:boolean項目のselectOneMenuがnull値で動作しない

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="true" itemLabel="Yes"/> 
    <f:selectItem itemValue="false" itemLabel="No"/> 
</h:selectOneMenu> 

私は「どれ..」に選択した場合、それは(ブール値です)registrationCompleteフィールドに「偽」が割り当てられます。したがって、私はselectOneMenuを次のように作成しています。したがって、nullは、偽と解釈されます。次のように

<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="#{true}" itemLabel="Yes"/> 
    <f:selectItem itemValue="#{false}" itemLabel="No"/> 
</h:selectOneMenu> 

や面-configにIも登録コンバータ:

<converter> 
    <converter-id>booleanConverter</converter-id> 
    <converter-class>javax.faces.convert.BooleanConverter</converter-class> 
</converter> 

及びそれを使用しようとした:

を私はまた、SelectItem関数(複数可)にブール値を使用しようとしたものです
<h:selectOneMenu value="#{personList.criteria.registrationComplete}" > 
    <f:selectItem itemValue="#{null}" itemLabel="Any.." /> 
    <f:selectItem itemValue="true" itemLabel="Yes"/> 
    <f:selectItem itemValue="false" itemLabel="No"/> 
     <f:converter converterId="booleanConverter"/> 
</h:selectOneMenu> 

しかし、これらすべての試みでは、同じ値 - が選択されたときにfalseと解釈されました。

私はそれをデバッグし、スタックトレースで私はそれが起こる場所を見つけました。 AstValue.setValue(EvaluationContext, Object) line: 204

では

ELSupport.coerceToType(value, targetClass) 

値のパラメータがnullの呼び出し、targetClassはブール値です。次に、このcoerceToTypeメソッドはfalseを返します。

どのようにこの問題を解決するためのアイデアですか?ありがとう!

+0

setRegistrationComplete()メソッドのシグネチャは何ですか?議論のタイプは何ですか?ブール値かブール値か – prageeth

+0

@prageeth:OPは明確に 'ブール'と述べました。 – BalusC

+0

@prageeth public void setRegistrationComplete(Boolean registrationComplete)です。フィールドregistrationCompleteはブール値 – lukas

答えて

8

これはTomcatとJBossで使用されているApache ELパーサーにとって典型的です。 ELの値をnullに強制すると、プリミティブとラッパーオブジェクトの表現を区別できないことが知られています。ラッパーの型は常にプリミティブとして扱われます。たとえば、Glassfishではうまく動作します。

あなたのサーバーの起動スクリプトに次のVM引数を追加することによって、このApacheのELパーサの動作をオフにすることができます

-Dorg.apache.el.parser.COERCE_TO_ZERO=false 
関連する問題