Struts 2 - повторное использование средства проверки пользовательских выражений
В распорках 2 мы можем разработать @CustomValidator
которые могут быть использованы в широком применении
@CustomValidator(type = "CustomerNumberValidator", fieldName = "customerNo")
Для валидации БОЛЬШЕ ЧЕМ ОДНО ПОЛЕ мы используем @ExpressionValidator
@ExpressionValidator(expression =
"( (!''.equals(account.firstName) && (!''.equals(account.lastName) )
|| (presonalAccount == false)",
key = "validate.account.name")
Если выражение слишком сложное и должно работать на БОЛЕЕ ОДНОМ ПОЛЕ, мы используем OGNL для вызова статического метода. Статический метод выполнит проверку и вернет boolean
например
@ExpressionValidator(expression = "@foo.bar.CalendarUtil@compareDates(fromDate,toDate)", key = "validate.date.before")
Выше приведен пример использования валидатора пользовательских выражений! И мы используем @foo.bar.CalendarUtil@compareDates
в приложении, чтобы сделать эту проверку для нас.
Есть ли другой подход, который позволяет нам использовать пользовательский широкий валидатор?! Существует ли какой-либо специальный валидатор выражений, который можно добавить в Struts, и мы можем вызывать его в действии так, как используем @CustomValidator
2 ответа
Создайте пользовательский валидатор (не связанный с полем):
public final class CompareDatesValidator extends ValidatorSupport {
private String fromDate; // getter and setter
private String toDate; // getter and setter
@Override
public void validate(Object o) throws ValidationException {
Date d1 = (Date)parse(fromDate, Date.class);
Date d2 = (Date)parse(toDate, Date.class);
if (d1==null || d2==null || d2.before(d1)){
addActionError(getDefaultMessage());
}
}
}
Зарегистрируйте пользовательский валидатор в validators.xml
файл:
<?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="compareDatesValidator"
class="org.foo.bar.CompareDatesValidator"/>
</validators>
Используйте валидатор в действии:
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;
}
Вы можете использовать неполевой пользовательский валидатор, если вам нужно проверить несколько полей. Необязательный пользовательский валидатор должен расширяться ValidatorSupport
и реализовать validate
метод. Затем примените пользовательский валидатор в своем -validation.xml
или использовать @CustomValidator
аннотаций. Там вы можете добавить пользовательские выражения как @ValidationParameter
и разбирать их, когда вы делаете проверку. Обратите внимание, что эту технику я использовал сначала в этом ответе:
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()); } }
Другой вариант - переопределить validate
метод ActionSupport
учебный класс. Вызов этого метода контролируется с помощью validation
перехватчик. Этот метод проверки известен как programmatic
и используется по умолчанию независимо от валидаторов, применяемых во время declarative
Проверка.