Пользовательский валидатор с атрибутами в Facelets - PullRequest
2 голосов
/ 05 августа 2010

Я написал собственный валидатор, который ожидает установки атрибута. Я знаю, что должен написать обработчик (TagHandler или ValidatorHandler?), Чтобы установить этот атрибут, но у меня возникают проблемы при его выполнении.

<tag>
    <tag-name>validateCustom</tag-name>
    <validator>
        <validator-id>package.CUSTOM_VALIDATOR</validator-id>
    </validator>
</tag>

Где поместить элемент handler-class? И как мне написать обработчик, чтобы он передавал атрибуты моему пользовательскому валидатору?

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 23 января 2011

Вот валидатор со скелетом пользовательского атрибута:

public class CustomValidator implements Validator, Serializable
{
    private static final long serialVersionUID = ...;
    private String someAttribute;

    public void setSomeAttribute(String someAttribute)
    {
        this.someAttribute = someAttribute;
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value)
    throws ValidatorException 
    {
        // Do validation
    }
}

Вот обработчик тега:

public class CustomValidatorHandler extends ValidateHandler
{
    private final TagAttribute someAttribute;

    public CustomValidatorHandler(ValidatorConfig config)
    {
        super(config);

        someAttribute = this.getAttribute("someAttribute");
    }

    @Override
    protected Validator createValidator(FaceletContext ctx)
    {
        CustomValidator result = (CustomValidator) ctx
        .getFacesContext()
        .getApplication()
        .createValidator("package.CUSTOM_VALIDATOR");

        if (someAttribute != null) result.setSomeAttribute(someAttribute.getValue(ctx));

        return result;
    }
}

А вот часть файла taglib:

<tag>
    <tag-name>validateCustom</tag-name>
    <validator>
        <validator-id>package.CUSTOM_VALIDATOR</validator-id>
    <handler-class>package.CustomValidatorHandler</handler-class>
    </validator>
</tag>
0 голосов
/ 23 мая 2013

Предлагаемое решение не работает, а также слишком сложно. В JSF 1.2 нет необходимости в классе обработчика и вообще не поддерживается класс обработчика в теге валидатора.

Так что все, что вам нужно, это.

Валидатор:

public class CustomValidator implements Validator, Serializable
{
    private static final long serialVersionUID = ...;
    private String someAttribute;

    public void setSomeAttribute(String someAttribute)
    {
        this.someAttribute = someAttribute;
    }

    @Override
    public void validate(FacesContext context, UIComponent component, Object value)
    throws ValidatorException 
    {
     // Do validation
    } 
}

Объявление / регистрация пользовательского валидатора вface-config.xml

<validator>
    <validator-id>customValidator</validator-id>
    <validator-class>package.CustomValidator</validator-class>
</validator>

Taglib.xml (например, my.taglib.xml):

<?xml version="1.0"?>
<!DOCTYPE facelet-taglib PUBLIC
 "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN"
 "http://java.sun.com/dtd/facelet-taglib_1_0.dtd">
<facelet-taglib>
<namespace>http://myNS.com/jsf</namespace>
<tag>
    <tag-name>myCustomValidator</tag-name>
    <validator>
        <validator-id>customValidator</validator-id>
    </validator>
</tag>
</facelet-taglib>

Наконец-то регистрация taglib.xml в web.xml:

<context-param>
    <param-name>facelets.LIBRARIES</param-name>
    <param-value>/WEB-INF/my.taglib.xml</param-value>
</context-param>

Так что все это не нужно обработчик: -)

...