2015-01-15 3 views
2

를 사용하여 기본적으로 감지되지JSR-303 오류는 기본적으로 내 JSR-303 주석을 잡을하지 않는 @Valid 주석을 제공하지만, 다음 방법을 사용하여 잡는 방법은 무엇 @Valid 주석

@Bean 
public ResourceBundleMessageSource messageSource() { 

    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); 

    String[] strBaseNames = { 
      "resources.messages.layout.LayoutResources", 
      "resources.messages.layout.MenuResources", 
      "resources.messages.global.GlobalResources" 
    }; 

    messageSource.setUseCodeAsDefaultMessage(true); 
    messageSource.setDefaultEncoding("UTF-8"); 
    messageSource.setBasenames(strBaseNames); 

    return messageSource; 
} 

@Bean 
public LocalValidatorFactoryBean jsr303Validator() { 

    LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 
    localValidatorFactoryBean.setValidationMessageSource(this.messageSource()); 

    return localValidatorFactoryBean; 
} 

UserController.java

@Controller 
@RequestMapping(value = "/security/user", method = RequestMethod.GET) 
public class UserController { 

@Autowired 
private SecurityService securityService; 

@Autowired 
SessionObject sessionObject; 

@Autowired 
@Qualifier("jsr303Validator") Validator validator; 

@RequestMapping(value = "/edit/validate", method = RequestMethod.POST) 
public String validateEdit(@ModelAttribute @Valid User user, 
          BindingResult result, 
          Model model) { 

    String strViewName = "common/error"; 

    validator.validate(user, result); 

    if(result.hasErrors()) { 
     strViewName = "user/userEdit"; 
    } else { 
     ... update work ... 
     strViewName = "user/success"; 
    } 

    return strViewName; 
} 

리소스 : http://www.wenda.io/questions/2462924/convert-jsr-303-validation-errors-to-springs-bindingresult.html

@Valid 주석 만 사용하는 경우 result.hasErrors()는 항상 비어 있으므로 결국 ConstraintViolationException이 발생합니다 (아래 참조). 하지만 각 컨트롤러에서 jsr303validator bean을 autowire 할 필요없이 @Valid 주석 만 사용하여 JSR-303 유효성 검사를 구현하고 싶습니다.

제약 조건 위반 로그 다음은 순으로 하였다 필요했다

@NotBlank(message = "error.userid.notnull") 
@Size(min = 0, max = 14, message = "error.firstname.length") 
private String strUserId = ""; 

@NotBlank(message = "error.firstname.notnull") 
@Size(min = 0, max = 50, message = "error.firstname.length") 
private String strFirstName = ""; 

@NotBlank(message = "error.lastname.notnull") 
@Size(min = 0, max = 50, message = "error.lastname.length") 
private String strLastName = ""; 

당신

+0

혹시이 문제를 해결 했습니까? – Stewart

+0

예, 솔루션을 즉시 게시하십시오. –

답변

0

감사

Caused by: javax.validation.ConstraintViolationException: Validation failed for classes [spring4base.model.security.User] during update time for groups [javax.validation.groups.Default, ] 
List of constraint violations:[ 
ConstraintViolationImpl{interpolatedMessage='error.firstname.notnull', propertyPath=strFirstName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.firstname.notnull'} 
ConstraintViolationImpl{interpolatedMessage='error.userid.notnull', propertyPath=strUserId, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.userid.notnull'} 
ConstraintViolationImpl{interpolatedMessage='error.lastname.notnull', propertyPath=strLastName, rootBeanClass=class spring4base.model.security.User, messageTemplate='error.lastname.notnull'} 

]

User.java 추적 r 내 경우 작동하도록하려면 :

먼저 Java 구성 클래스 (내 경우에는 WebAppContext.java)에 LocalValidatorFactoryBean을 정의하십시오. ,

@Autowired 
private Validator jsr303Validator; 

그리고, 내 JSR-303이 실행 내가 얻을 발견하는 유일한 방법은 손으로 그들을 실행하는 것입니다

그런 다음 내 컨트롤러에, 그 유효성과 같이 autowire하기 좋아요 :

@RequestMapping(value = "/update", method = RequestMethod.POST) 
public String processUpdate(@ModelAttribute UserForm userForm, 
          BindingResult result, 
          RedirectAttributes redirectAttributes, 
          SessionStatus status) throws CheckedPersistenceException { 

    this.userFormValidator.validate(userForm, result); 

    if (!result.hasErrors()) { 
     this.jsr303Validator.validate(userForm, result); 
    } 

    if(result.hasErrors()) { 
     return this.UPDATE_VIEW; 
    } 

    ... 
} 
+2

그러나 정확히이 질문에 당신이 가지고있는 것이 아닙니까? – Stewart