2

JSF 2.1 バニラ (グラスフィッシュ 3.1) の複合コンポーネントで少し問題があります。私の問題の簡略版は次のとおりです。

【複合成分】

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:c="http://java.sun.com/jsp/jstl/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:cc="http://java.sun.com/jsf/composite">

    <!-- INTERFACE -->
    <cc:interface>

            <cc:attribute name="value" required="true"/>
            <cc:attribute name="title" required="false" default=""/>

            <cc:editableValueHolder name="inputTarget" targets="labeledInputField"/>

    </cc:interface>

    <!-- IMPLEMENTATION -->
    <cc:implementation>

            <p:inputText id="labeledInputField" 
                label="#{cc.attrs.title}"
                value="#{cc.attrs.value}" 
                title="#{cc.attrs.title}">

                <cc:insertChildren/>

            </p:inputText>

    </cc:implementation>
</html>

【実装】

              <!-- thisPerson is passed in via ui:param to the facelet containing this code.  
                it works in other (non-composite) components on the page -->

              <comp:labeledInputText
                  id="baseUsername"
                  value="#{controller.username}"
                    title="#{bundle.Username}">

                  <f:validator for="inputTarget" binding="#{thisPerson.usernameValidator}"/>
                  <f:converter for="inputTarget" converterId="#{whiteSpaceTrimConverter}"/>

              </comp:labeledInputText>

問題は、「thisPerson.usernameValidator」が NULL と評価され、com.sun.faces.facelets.tag.jsf.ValidatorTagHandlerDelegateImpl が「validatorID」によってバリデーターをロードしようとするコードにスキップすることです。 「バインディング」によってバリデーターを送信しようとしているため、設定されていません。コンポジットを取得して ui:param 値を評価する方法、またはバリデーターを再加工する必要のない回避策はありますか (これは巨大なアンチパターンであり、今はダメージを元に戻す時間がありません)。バリデーターがバインディングを介して入ってくると仮定します。

別のファセットでは、「ソフト」参照ではなく具体的​​な Bean 参照に対してバリデーターをバインドしているため、複合が機能することを知っています。これはチャンピオンのように機能します。

ティア

4

1 に答える 1

2

正確な JSF 実装がわからない場合は、Mojarra を想定します。次の既知のバグが発生している可能性があります。

http://java.net/jira/browse/JAVASERVERFACES-2040

これが正確な問題であるかどうかに関係なく、部分的な状態の保存を無効にして、問題が解決するかどうかを確認できます。もしそうなら、それはあなたがこの問題に直面していることを意味します。これは明らかに(修正された?)Mojarraの以降のバージョンで発生しました。

もう 1 つの可能性は、ファセットの形式でバリデーターrenderFacetの代わりに使用insertChildrenして挿入することです。

于 2012-07-27T19:57:31.693 に答える