
Question:
I have written a custom Validator that expects an attribute to be set. I know I have to write a Handler (TagHandler or ValidatorHandler?) to set that attribute, but I am having trouble doing it.
<tag> <tag-name>validateCustom</tag-name> <validator> <validator-id>package.CUSTOM_VALIDATOR</validator-id> </validator> </tag>
Where do i put the handler-class
element? And how do I write the handler so that it will pass the attributes to my custom validator?
Thanks in advance!
Solution:1
Here is a validator with custom attribute skeleton:
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 } }
Here is the tag handler:
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; } }
And here is part of the taglib file:
<tag> <tag-name>validateCustom</tag-name> <validator> <validator-id>package.CUSTOM_VALIDATOR</validator-id> <handler-class>package.CustomValidatorHandler</handler-class> </validator> </tag>
Solution:2
The suggested solution doesn't work and it's overcomplicated as well. There is no need of a handler class in JSF 1.2 and there is no support for a handler class in the validator tag at all.
So all you need is.
The Validator:
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 } }
The declaration/registration of the custom validator in the faces-config.xml
<validator> <validator-id>customValidator</validator-id> <validator-class>package.CustomValidator</validator-class> </validator>
The taglib.xml (e.g. 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>
Finally the registration of the taglib.xml in web.xml:
<context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/my.taglib.xml</param-value> </context-param>
So thats all no need of a handler :-)
Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
EmoticonEmoticon