Трябва да си направиш собствен facelet таг.
Направи си файл с име myvalidators.taglib.xml и го сложи в клас пътя на следното място
/META-INF/myvalidators.taglib.xml и със следното съдържание
<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://example.com/jsf/my/validators</namespace>
<tag>
<tag-name>myValidator</tag-name>
<validator>
<validator-id>myValidator</validator-id>
</validator>
</tag>
</facelet-taglib>
Важно е файла "myvalidators.taglib.xml" да е разположен във /META-INF/ директорията някъде в клас пътя, за да може фейслетите да я открият (autodiscover). Това се нарича "well known location" за библиотеки на фейслетите. Също важно е суфикса на файла да е ".taglib.xml".
Правиш си собствен валидатор и го маркираш със SEAM анотациите. Напиши си твой код, който да валидира едит полето. Можеш да използваш новото си поле от валидатора, тъй като то трябва автоматично да е инициализирано.
package com.example.validators;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.ScopeType;
import javax.faces.context.FacesContext;
import javax.faces.component.UIComponent;
import javax.faces.validator.ValidatorException;
import javax.faces.application.FacesMessage;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
import javax.faces.component.UIComponent;
import java.io.Serializable;
@org.jboss.seam.annotations.faces.Validator(id = "myValidator")
@Name("myValidator")
public class MyCustomValidator implements Validator, Serializable {
private int exampleProp;
public void validate(FacesContext facesContext, UIComponent c, Object o) throws ValidatorException {
if (...condition...) {
throw new ValidatorException(new FacesMessage(...whatever... ));
}
}
public int getExampleProp() {
return exampleProp;
}
public void setExampleProp(int exampleProp) {
this.exampleProp = exampleProp;
}
Анотирането на валидатора със seam анотациите ти спестява обявяването му във faces-config.xml файла. Твоите атрибути от xhtml страницата се връзват автоматично към полетата на валидатора(autowired).
Във XHTML може да използваш валидатора по този начин:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:s="http://jboss.com/products/seam/taglib"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:a4j="http://richfaces.org/a4j"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:my="http://example.com/jsf/my/validators">
<h:inputText id="someField" value="#{somebean.name}"
required="true">
<my:myValidator exampleProp="100"/>
</h:inputText>
</ui:composition>