2009-12-10 4 views
19

validators을 Spring MVC 프레임 워크에서 작성하려고 시도했지만 문서에 눈에 띄는 누락이 있습니다. Errors 객체에 오류를 전달할 때 대부분의 메소드는 errorCode라는 String 매개 변수를 필요로합니다. 이 errorCode는 특정 오류 메시지에 대한 스탠드 인 역할을 올바르게 이해하고 있습니다. 그러나 나는이 코드가 어디에 매핑되는지를 이해할 수 없다.스프링 MVC 유효성 검사 오류 코드는 어디에서 해결 되었습니까?

다음은 Spring MVC의 Javadoc에서 언급 한 예제입니다.

public class UserLoginValidator implements Validator { 

    private static final int MINIMUM_PASSWORD_LENGTH = 6; 

    public boolean supports(Class clazz) { 
     return UserLogin.class.isAssignableFrom(clazz); 
    } 

    public void validate(Object target, Errors errors) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "userName", "field.required"); 
     ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "field.required"); 
     UserLogin login = (UserLogin) target; 
     if (login.getPassword() != null 
      && login.getPassword().trim().length() < MINIMUM_PASSWORD_LENGTH) { 
      errors.rejectValue("password", "field.min.length", 
       new Object[]{Integer.valueOf(MINIMUM_PASSWORD_LENGTH)}, 
       "The password must be at least [" + MINIMUM_PASSWORD_LENGTH + "] characters in length."); 
     } 
    } 
} 

누구든지 나를 계몽시킬 수 있습니까?

답변

15

기본 메시지 해결 프로그램을 사용하고 있습니다. 내 dispatcher-servlet.xml에서

, 나는

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basename" value="messages" /> 
</bean> 

하고있는 나는이 같은 매핑을 포함 "messages.properties"라는 텍스트 파일이 내 수업 디렉토리의 최상위에 :

error.firstname.null=Please enter your first name. 
error.lastname.null=Please enter your last name. 

커스텀 MessageCodesResolver를 사용하고 싶다면 MessageCodeResolver 인터페이스를 구현하고 다음과 같이 주어진 컨트롤러에 대한 리졸버를 정의 할 수 있습니다 :

<bean id="myController"> 
    <property name="messageCodesResolver" ref="myMessageCodesResolver" /> 
</bean> 

현재 사용자 정의 MessageCodeResolver을 전역으로 정의하는 방법은 없습니다. enhancement request for that here이 있습니다. 빈 상속을 사용하여 모든 컨트롤러 bean을 하나의 컨트롤러 bean 정의에서 상속받는 한 가지 방법은 here입니다.

//result is BindingResult 
    List<String> errors = new ArrayList<String>(); 
    List<ObjectError> allErrors = result.getAllErrors(); 
    for (ObjectError error : allErrors) { 
     String message = messageSource.getMessage(error, null); 
     errors.add(message); 
    } 
+0

정보를 제공해 주셔서 감사 드리며, 유효성 검사기를 사용할 수 있습니다. 그러나 맞춤 MessageCodeResolver에서 다시 연결하고 싶다면 무엇을해야할지 배우기 위해 어디로 갈까요? 또한 번영을 위해서 ResourceBundleMessageSource의 javadoc은 http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html에 있습니다. –

+1

사용자 정의 MessageCodeResolver를 사용하려는 경우 주어진 컨트롤러에 하나를 지정할 수 있습니다. 한 가지 접근법은 빈 상속을 사용하여 여기에 설명 된대로 모든 컨트롤러 bean이 하나의 컨트롤러 bean 정의에서 상속되도록하는 것입니다. http://forum.springsource.org/showthread.php?t=46336 현재 방법은 없습니다 커스텀 MessageCodeResolver를 전역 적으로 정의한다. https://jira.springsource.org/browse/SPR-5187 –

+1

참고로, 글로벌 맞춤'MessageCodeResolver' 기능은 결국 Spring 3.1 (2011)에 구현되었습니다. [SPR-6506] (https://jira.spring.io/browse/SPR-6506)도 참조하십시오. – vallismortis

3

이들은 MessageSourceMessagesCodeResolver으로 해결됩니다. 유효성 검사 오류에 해당하는 메시지를 출력하기

우리가 논의해야 할 마지막 일 :

Here는 참조 설명서의 관련 섹션입니다. 위에 표시된 예에서 우리는 이름과 나이 필드를 거부했습니다. MessageSource을 사용하여 오류 메시지를 출력하려면 필드를 거부 할 때 제공 한 오류 코드 (이 경우 '이름'과 '연령')를 사용하여 오류 메시지를 출력합니다. 예를 들어 ValidationUtils 클래스를 사용하여 직접 또는 간접적으로 rejectValue을 호출하거나 Errors 인터페이스의 다른 거부 메소드 중 하나를 호출하면 기본 구현은 전달한 코드를 등록 할뿐만 아니라 추가 오류 코드.

+0

가 어디 MessageCodeResolver 사용할지 정의합니까 : 오류 JSP 태그 다음 다음을 수행 할 수 있습니다 : 당신은 형태와 유사한 컨트롤러의 메시지를 해결하려면 어떤 이유 –

+0

지정하지 않으면 기본 인스턴스 (DefaultMessageCodesResolver)가 사용됩니다. 그래도 MessageSource를 등록하면 자동으로 사용됩니다. –

+0

어떻게 메시지 소스를 등록합니까? 나는 messageCodesResolver를 빈 프로퍼티로 간주한다. MessageCodeResolver를 전체 응용 프로그램에서 보편적으로 설정하는 방법이 있습니까? –

1

?
+0

나는 MessageSource가 @Autowired 일 수 있다는 것을 지적하고 싶다. – leojh