Я использую HibernateValidator 4.3.1. Валидации выполняются по назначению во всем приложении.
Я зарегистрировал несколько пользовательских редакторов для выполнения глобальной проверки, например, для обеспечения числовых значений (double
, int
и т. д.) в текстовом поле, для обеспечения действительных дат относительно Joda-Time API и т. д.
В этом типе проверки я разрешаю нулевые/пустые значения, устанавливая для параметра allowEmpty
значение false
, как обычно, чтобы проверить его отдельно, особенно для отображения отдельных удобных для пользователя сообщений об ошибках, когда такие поля оставлены пустыми.
Поэтому в дополнение к проверке с помощью HibernateValidator и пользовательских редакторов я пытаюсь использовать следующую стратегию проверки. Опять же, этот тип проверки предназначен только для тех полей, которые зарегистрированы для пользовательских редакторов, если они оставлены пустыми.
Ниже приведен класс, реализующий org.springframework.validation.Validator
.
package test;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
import org.springframework.validation.Validator;
import validatorbeans.TempBean;
@Component
public final class TempValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
System.out.println("supports() invoked.");
return TempBean.class.isAssignableFrom(clazz);
}
@Override
public void validate(Object target, Errors errors) {
TempBean tempBean = (TempBean) target;
System.out.println("startDate = " + tempBean.getStartDate() + " validate() invoked.");
System.out.println("doubleValue = " + tempBean.getDoubleValue() + " validate() invoked.");
System.out.println("stringValue = " + tempBean.getStringValue() + " validate() invoked.");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "startDate", "java.util.date.nullOrEmpty.error");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "doubleValue", "java.lang.double.nullOrEmpty.error");
}
}
Класс обозначен аннотацией @Component
, чтобы его можно было автоматически связать с конкретным классом контроллера Spring. Операторы отладки отображаются точно на основе ввода, предоставленного пользователем.
Ниже приведен класс контроллера.
package controller;
import customizeValidation.CustomizeValidation;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.groups.Default;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.validation.DataBinder;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import test.TempValidator;
import validatorbeans.TempBean;
@Controller
public final class TempController {
@Autowired
private TempService tempService;
private TempValidator tempValidator;
public TempValidator getTempValidator() {
return tempValidator;
}
@Autowired
public void setTempValidator(TempValidator tempValidator) {
this.tempValidator = tempValidator;
}
@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"})
public String showForm(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) {
return "admin_side/Temp";
}
@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"})
public String onSubmit(@ModelAttribute("tempBean") @Valid TempBean tempBean, BindingResult errors, Map model, HttpServletRequest request, HttpServletResponse response) {
//tempValidator.supports(TempBean.class);
//tempValidator.validate(tempBean, errors);
DataBinder dataBinder = new DataBinder(tempBean);
dataBinder.setValidator(tempValidator);
dataBinder.validate();
//errors=dataBinder.getBindingResult();
if (CustomizeValidation.isValid(errors, tempBean, TempBean.ValidationGroup.class, Default.class) && !errors.hasErrors()) {
System.out.println("Validated");
}
return "admin_side/Temp";
}
}
Я вызываю валидатор из самого класса контроллера Spring (который я действительно хочу) с помощью
DataBinder dataBinder = new DataBinder(tempBean);
dataBinder.setValidator(tempValidator);
dataBinder.validate();
Валидатор вызывается, но ожидаемая проверка не выполняется.
Если только я вызову валидатор вручную, используя следующий оператор (который закомментирован выше),
tempValidator.validate(tempBean, errors);
затем выполняется проверка. Поэтому я не верю, что мой валидатор работает правильно. Почему это не работает с DataBinder
?
В моем файле application-context.xml
этот bean-компонент просто настроен следующим образом.
<bean id="tempValidator" class="test.TempValidator"/>
Это множество пакетов, как показано ниже, включая пакет test
, в который заключен класс TempValidator
, определяются автоматически.
<context:component-scan base-package="controller spring.databinder validatorbeans validatorcommands test" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/>
<context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/>
</context:component-scan>
Я даже пытался поставить
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
В моем файле dispatcher-servlet.xml
.
Что я здесь упускаю?
tempValidator
. - person Tiny   schedule 21.02.2013