You could use a non-field custom validator to validate any number of fields. For this purpose you should create a custom validator that extend ValidatorSupport
and implement validate
method which is inherited from Validator
interface but doesn't have default implementation. You should write this implementation to do custom validation. For example you want to create a RetypeValidator
which validates two fields have the same value. It could look like
public class RetypeValidator extends ValidatorSupport {
private String value = null;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
private String retypeValue = null;
public String getRetypeValue() {
return retypeValue;
}
public void setRetypeValue(String value) {
retypeValue = value;
}
@Override
public void validate(Object object) throws ValidationException {
String value = (String) parse(this.value, String.class);
String retypeValue = (String) parse(this.retypeValue, String.class);
if (value != null && retypeValue != null && !value.equals(retypeValue))
addActionError(getDefaultMessage());
}
}
then you have to add this validator to the configuration in the validators.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
"-//Apache Struts//XWork Validator Config 1.0//EN"
"http://struts.apache.org/dtds/xwork-validator-config-1.0.dtd">
<validators>
<validator name="retypeValidator" class="org.custom.struts.vaidators.RetypeValidator"/>
</validators>
Now, you have a custom validator name that you could use with @CustomValidator
annotation.
@Validations(
customValidators = @CustomValidator(type="retypeValidator", message="the value and retype value should be the same",
parameters = { @ValidationParameter( name = "value", value = "${password}" ), @ValidationParameter( name = "retypeValue", value = "${conformPassword}" )})
)
Note, password
and conformPassword
are OGNL expressions used to parse when being validated.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…