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 参照に対してバリデーターをバインドしているため、複合が機能することを知っています。これはチャンピオンのように機能します。
ティア