- type: Refers to the "name" given to the validator in the validators.xml file.
- message: Message to be displayed when this validator fails.
To run this sample, follow these steps... There's More
- Create a simple struts project as described in the previous example, Struts 2 Validation : Annotations
- Create the new validator by extending the FieldValidatorSupport classpackage validators; 
 import com.opensymphony.xwork2.validator.ValidationException;
 import com.opensymphony.xwork2.validator.validators.FieldValidatorSupport;
 public class NumberFieldValidator extends FieldValidatorSupport {
 public void validate(Object object) throws ValidationException {
 String fieldName = getFieldName();
 Object value = this.getFieldValue(fieldName, object);
 if (!(value instanceof String)) {
 return;
 }
 
 String str = ((String) value).trim();
 if (str.length() == 0) {
 return;
 }
 
 try {
 Double.parseDouble(str);
 }catch(NumberFormatException nfe) {
 addFieldError(fieldName, object);
 return;
 }
 try {
 Integer.parseInt(str);
 }catch(NumberFormatException nfe) {
 addFieldError(fieldName, object);
 return;
 }
 
 }
 }NumberFieldValidator.java - The custom validator may extend the FieldValidatorSupport or the ValidatorSupport classes.
- The FieldValidatorSupport class extends ValidatorSupport to add field specific information to the Field.
- The is numeric check is performed by trying to convert the input string to Integer or Double and catching any exception.
- The addFieldError method is used add any failed validations to the list of errors to be displayed.
- The getFieldName and getFieldValue methods are implemented in the superclasses to retrieve the field name and field value for the field beign validated.
 
- Declare the new custom validator in the validators.xml file. The validators.xml file must be in the classpath of the application.<?xml version="1.0" encoding="UTF-8"?> 
 <!DOCTYPE validators PUBLIC
 "-//OpenSymphony Group//XWork Validator Config 1.0//EN"
 "http://www.opensymphony.com/xwork/xwork-validator-config-1.0.dtd">
 <validators>
 <validator name="numericField" class="validators.NumberFieldValidator"/>
 </validators>validators.xml 
 Note: The name attribute of the validator must match the type attribute of the @CustomValidator Annotation used in the Action class.
- Add the additional check to the Action class setPrice() method.@RequiredStringValidator(type = ValidatorType.FIELD, message = "Price Required") 
 @CustomValidator(type = "numericField", message = "Price must be a number")
 public void setPrice(String price) {
 this.price = price;
 }AddTransactionAction.java 
 Note: the type attribute of the @CustomValidator Annotation must match the name of the validator as defined in the validators.xml file.

No comments:
Post a Comment