別のバリデータをラップし、属性として追加します。
NumberValidator
で
<f:validator validatorId="hits.numberValidator"/>
<f:attribute name="posValue" value="#{entry.dataEntry.posValue}" />
<f:attribute name="negValue" value="#{entry.dataEntry.negValue}" />
そして:f:attribute
が結ばれているので#{entry}
が、実際にh:dataTable
またはui:repeat
のvar
属性で宣言されているような反復項目であるとき、これは動作しないことを
Boolean negValue = component.getAttributes().get("negValue");
if (posValue != null && posValue) {
new PositiveNumberValidator().validate(context, component, value);
}
Boolean posValue = component.getAttributes().get("posValue");
if (negValue != null && negValue) {
new NegativeNumberValidator().validate(context, component, value);
}
注意その出力ではなく、JSFコンポーネントに渡します。変数名#{entry}
は、これが実際にはそうでないことを示唆しているので、ここで説明します。
ラップDataModel
でコレクション:
private DataModel entries;
public Bean() {
entries = new ListDataModel(someDAO.list());
}
// ...
はh:dataTable
でそれを使用するか、ui:repeat
を次のように
<h:dataTable value="#{bean.entries}" var="entry">
<h:column>
<h:inputText validator="#{bean.numberValidator}" />
</h:column>
</h:dataTable>
を、次のようBean
でバリデータを実装します。
public void numberValidator(FacesContext context, UIComponent component, Object value) throws ValidatorException) {
Entry entry = (Entry) entries.getRowData();
if (entry.isPosValue()) {
new PositiveNumberValidator().validate(context, component, value);
}
if (entry.isNegValue()) {
new NegativeNumberValidator().validate(context, component, value);
}
}
(これらのバリデータをスレッドセーフである場合のみ)代わりにインスタンス変数にすることができます(スレッドセーフである場合のみ)
ありがとうBalusC!最初のオプションが働いた。 – Perry