Bean Validation에서 Error Message에 Field Name을 포함시키고 싶을 때 LocalValidatorFactoryBean에서 출력 할 수 없다

개요



Bean Validation을 사용하여 입력 검사를 수행하고 오류 메시지를 출력하는 경우 내용에 필드 이름을 포함시키고 싶을 때는주의가 필요했기 때문에 메모.

실행 환경


  • java SE - 1.8
  • org.springframework - 3.1.1.RELEASE
  • javax.validation - 2.0.1.Final
  • org.hibernate.validator - 6.0.13.Final

  • SampleProject를 GitHub에 넣습니다.



    다음 양식에 다음과 같은 메시지를 출력하고 싶은 경우

    UserForm.java
    import java.io.Serializable;
    import javax.validation.constraints.Max;
    import javax.validation.constraints.Min;
    import javax.validation.constraints.NotNull;
    import javax.validation.constraints.Size;
    
    public class UserForm implements Serializable {
        private static final long serialVersionUID = 1L;
    
        @NotNull(message = "{userForm.name}")
        @Size(min = 1, max = 20, message = "{userForm.name}")
        private String name;
        // getter/setterは省略
    
    "[name] is not null."
    

    주의점


  • LocalValidatorFactoryBean에서는 출력 할 수 없다

  • UserControl.java
    import javax.validation.Validator;
    
    @Resource
    private Validator validator;
    
    // 実際の処理部分 
    Set<ConstraintViolation<UserForm>> violations = validator.validate(form);
    if (!violations.isEmpty()) {
        for (ConstraintViolation<UserForm> v : violations) {
            log.info(v.getMessage());
        }
    }
    

    application-context.xml
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" />
    

    ValidationMessage.properties
    userForm.name={0} is not null.
    

    {0}이 필드 이름으로 대체된다고 생각했지만 실제 출력 결과는 다음과 같이 대체되지 않고 출력됩니다.
    {0} is not null.
    

    이유


  • 필드 이름의 대체는 Spring이 제공하는 데이터 바인딩에 의해 실현되는 패턴

  • 즉, 다음과 같이 @Validated

    UserControl.java
    @RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
    public String createConfirm(@Validated UserForm form, BindingResult result) {
        if (result.hasErrors()) {
            return "user/createForm";
        }
        return "user/createConfirm";
    }
    

    또는 SmartValidator 사용

    UserControl.java
    import org.springframework.validation.SmartValidator;
    
    @Resource // SmartValidatorは<mvc:annotation-driven>の設定が行われていれば使用できるため、Bean定義不要
    private SmartValidator smartValidator;
    
    @RequestMapping(value = "create", method = RequestMethod.POST, params = "confirm")
    public String createConfirm(UserForm form, BindingResult result) {
        smartValidator.validate(form, result);
        if (result.hasErrors()) {
            return "user/createForm";
        }
        return "user/createConfirm";
    }
    

    요약


  • LocalValidatorFactoryBean에서는, 에러 메세지에 필드명을 포함한 출력을 할 수 없습니다.
  • Spring의 데이터 바인딩에 의해 실현되기 때문에
  • 실현하려면 @Validated 또는 SmartValidator를 사용합니다

  • ※아무래도 LocalValidatorFactoryBeand가 아니면 안된다면, 개별적으로 메시지를 정의하면 어쩔 수 없는 것 같다

    좋은 웹페이지 즐겨찾기