- 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 class
package 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.
Hi,
ReplyDeleteThanks for this awesome post. I have followed in detail the steps you mentioned and am getting the following error:
Jul 10, 2008 5:47:20 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet default threw exception
java.lang.IllegalArgumentException: There is no validator class mapped to the name numericField
Can you tell what I might be missing?
Thanks!
Hi Abhi..great post. I have a question. Is it possible to access the request or the session from within the custom validator? I need to validate a captcha response from there. Thank you
ReplyDeleteHi, would u be interested for link exchange with my blog. Here is my blog http://software-wikipedia.blogspot.com/. Mail me at software.wikipedia@gmail.com
ReplyDeleteHello! I'm having a problema, the method 'validate' in the class 'NumericValidatorField' is having the value of the field equals 'null' no matter what type is the field value filled. does Someone know why ? Thanks!!
ReplyDeleteHi friends,
ReplyDeleteI have posted a clarification for the Struts2 custom validators with explanation here.go through this http://ram-ch9.blogspot.com/2009/01/struts-2-custom-validations.html
struts is good but why you don't use maplet class from Shine Enterprise Pattern stead struts
ReplyDeleterefer http://www.j2os.org
you have to put this in your validators.xml to run
ReplyDelete"
"