Java 在Struts 2中重用自定义表达式验证器
在Struts 2中,我们可以开发Java 在Struts 2中重用自定义表达式验证器,java,validation,struts2,struts-validation,struts2-convention-plugin,Java,Validation,Struts2,Struts Validation,Struts2 Convention Plugin,在Struts 2中,我们可以开发@CustomValidator,它可以在应用程序范围内使用 @CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo") 对于验证多个字段,我们使用@ExpressionValidator @ExpressionValidator(expression = "( (!''.equals(account.firstNa
@CustomValidator
,它可以在应用程序范围内使用
@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")
对于验证多个字段,我们使用@ExpressionValidator
@ExpressionValidator(expression =
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
|| (presonalAccount == false)",
key = "validate.account.name")
如果表达式太复杂,需要处理多个字段,则使用OGNL调用静态方法。例如,静态方法将执行验证并返回一个布尔值
@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")
以上是一些如何自定义表达式验证器
我们使用@foo.bar。CalendarUtil@compareDates
在应用程序范围内为我们进行此验证
有没有其他方法可以让我们使用自定义范围的验证器
是否有任何自定义表达式验证器可以添加到Struts中,我们可以使用@CustomValidator
的方式在操作中调用它?创建自定义验证器(与字段无关):
在validators.xml
文件中注册自定义验证器:
在操作中使用验证器:
private Date startDate; // getter and setter
private Date endDate; // getter and setter
@Validations(
customValidators={
@CustomValidator(type="compareDatesValidator",
message="Dates provided are not valid."
parameters={
@ValidationParameter(name="fromDate", value="${startDate}"),
@ValidationParameter(name="toDate", value="${endDate}")})})
public String execute(){
return SUCCESS;
}
如果需要验证多个字段,可以使用非字段自定义验证器。非字段自定义验证器应扩展验证器支持
并实现验证
方法。然后在-validation.xml
中应用自定义验证器,或者使用@CustomValidator
注释。在那里,您可以将自定义表达式添加为@ValidationParameter
,并在执行验证时解析它们
注意:
这是我在回答问题时首先使用的技巧:
另一个选项是重写ActionSupport
类的validate
方法。对该方法的调用是通过控制的。这种验证方法被称为编程验证,默认情况下使用,无论声明性验证期间应用了什么验证程序。太好了,正是我想要的,请在i18n应用程序中更新您的答案并让我知道,如何读取compareDatesValidator
中的自定义消息键,并在addActionError
中设置它对我来说似乎是另一个问题,因此最好将其作为另一个问题发布(如“如何从自定义验证器中获取i18n消息”)……好吧,我已在以下位置进行了询问:
private Date startDate; // getter and setter
private Date endDate; // getter and setter
@Validations(
customValidators={
@CustomValidator(type="compareDatesValidator",
message="Dates provided are not valid."
parameters={
@ValidationParameter(name="fromDate", value="${startDate}"),
@ValidationParameter(name="toDate", value="${endDate}")})})
public String execute(){
return SUCCESS;
}
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());
}
}