나는 HibernateValidator 4.3.1을 사용하고 있습니다. 유효성 검사는 전체 응용 프로그램에서 의도 한대로 수행됩니다.봄 3.2.0 유효성 확인
나는 이러한 유형의 등 Joda-Time API
에 대한 유효 기간을 보장하기위한 전 세계적으로 이러한 텍스트 필드에 숫자 값 (double
, int
등) 보장으로 유효성 검사를 수행하는 일부 사용자 지정 편집기를 등록 유효성 검사를 위해, false
으로 allowEmpty
매개 변수를 설정하여 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
주석으로 지정되어 있습니다. 디버깅 문은 사용자가 제공 한 입력을 기반으로 정확하게 표시됩니다.
다음은 컨트롤러 클래스입니다.
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();
하여 봄 컨트롤러 클래스 자체 (내가 실제로 할)에서 검증을한다 호출하고있어하지만 예상되는 검증 이이 수행되지 않습니다. 단지 내가 수동 (위 주석) 다음 문을 사용하여 검증을 호출하면
, 다음 유효성 검사가 수행
tempValidator.validate(tempBean, errors);
. 따라서 유효성 검사기가 올바르게 작동하고 있다고 생각하지 않습니다. DataBinder
과 함께 작동하지 않는 이유는 무엇입니까?
내 application-context.xml
파일에서이 빈은 간단히 다음과 같이 구성됩니다. TempValidator
클래스 내에 포함되어있는 test
패키지를 포함하여 아래와 같이
<bean id="tempValidator" class="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>
난 내 dispatcher-servlet.xml
파일에서
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
을 넣어 노력했다.
여기에서 무엇을 간과하겠습니까?
"dataBinder.validate();"줄에 휴식을 지정하면 그리고 단계적으로 들어가면 결국 어떤 유효성 검사기가 호출되는지 볼 수 있습니까? – CodeChimp
@CodeChimp - 호출 된 발리 데이터는 질문 -'tempValidator'에 지정된 것입니다. – Tiny