10

私は JSF 2.0、JBoss 7.1.1 Final を使用していますが、selectOneMenu に次の問題があります。マネージド Bean のフィールドを true/false/null に設定できるようにしたいと考えています。したがって、次の selectOneMenu を作成しました。

<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>

ここで、「Any..」を選択すると、registrationComplete フィールド (ブール値) に「false」が割り当てられます。したがって、null は false として解釈されます。また、selectItem(s) でブール値を使用しようとしました。

 <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>

また、次のように、faces-config にコンバーターを登録しました。

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

そしてそれを使用しようとしました:

<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>

しかし、これらの試行はすべて同じ動作になりました。null 値が選択された場合、false と解釈されました。

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

それが呼ぶ

ELSupport.coerceToType(value, targetClass)

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

この問題を解決する方法はありますか? ありがとう!

4

1 に答える 1

9

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

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

-Dorg.apache.el.parser.COERCE_TO_ZERO=false
于 2012-07-26T16:21:17.873 に答える