HibernateValidator4.3.1を使用しています。検証は、アプリケーション全体で意図したとおりに実行されます。
テキストフィールドの数値(など)を確認したり、 Joda-Time APIに関する有効な日付を確認したりするなどdouble
、グローバルに検証を実行するカスタムエディタをいくつか登録しました。int
このタイプの検証では、allowEmpty
パラメータをfalse
通常どおりに設定してnull /空の値を許可し、特にそのようなフィールドが空白のままの場合に個別のユーザーフレンドリーなエラーメッセージを表示するために個別に検証します。
したがって、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
ファイルで。
私はここで何を見落としていますか?