我正在使用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
档案中。
我在这里俯瞰什么?