我正在使用HibernateValidator 4.3.1。驗證在整個應用程序中按照預期執行。使用Spring 3.2.0驗證
我已經註冊了一些自定義的編輯器來執行驗證全球範圍內,如在文本字段確保數值(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
註釋指定,以便它可以自動連接到特定的春天控制器類。調試語句完全基於用戶提供的輸入顯示。
以下是控制器類。
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";
}
}
我被
DataBinder dataBinder = new DataBinder(tempBean);
dataBinder.setValidator(tempValidator);
dataBinder.validate();
調用從Spring控制器類本身(這是我確實想)驗證的驗證器調用,但預計該驗證不執行。
如果我調用驗證器使用下面的語句(這在上面已經說明輸出)手動,
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
文件。
我在這裏忽略了什麼?
如果你在行「dataBinder.validate();」並進入它,你能看到哪個驗證器最終被調用? – CodeChimp 2013-02-20 12:20:27
@CodeChimp - 調用的驗證器是question -'tempValidator中指定的驗證器。 – Tiny 2013-02-21 18:30:50