以下のようにcomposite component内に<f:event listener="#{cc.validate}" type="postValidate" />
を入れてもlistenerが呼ばれなかった。
<ui:component xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite"> <cc:interface componentType="inputDate"> <cc:attribute name="value" type="java.util.Date" shortDescription="The selected time. Defaults to now."/> </cc:interface> <cc:implementation> <f:event listener="#{cc.validate}" type="postValidate" /> <span id="#{cc.clientId}" style="white-space:nowrap"> <h:inputText id="day" binding="#{cc.day}" styleClass="inputText inputText-date"> <f:ajax event="change" execute="#{cc.clientId}" /> </h:inputText>日 <h:message for="day" styleClass="errorMessage"/> </span> </cc:implementation> </ui:component>
原因は結局わからず、f:validatorタグを使ってバリデーションを行った。 f:validatorタグを使って複数の入力項目に対してバリデーションをかける場合は対象の項目のうち一番下の項目にvalidatorタグを付けること。 validatorタグより下の項目の値はvalidateメソッドから取れないらしい。
参考: