복붙노트

[SPRING] Spring의 MessageInterpolator

SPRING

Spring의 MessageInterpolator

나는 Spring 3.1.1과 Hibernate-validator 4.3.0.Final을 사용하고 classpath에서 ValidationMessages로부터 유효성 검사 메시지를받는 기본 MessageInterpolator를 변경하는 데 문제가있다.

내 Spring messageSource에서 메시지를 가져올 ResourceBundleMessageInterpolator를 사용하고 싶다.

내 application-context.xml에서 이렇게했습니다.

<bean id="resourceBundleMessageInterpolator"
      class="org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator">
    <constructor-arg index="0">
        <bean class="org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator">
            <constructor-arg index="0" ref="messageSource"/>
        </bean>
    </constructor-arg>
</bean>
<bean id="validator"
      class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="messageInterpolator" ref="resourceBundleMessageInterpolator"/>
</bean>

그리고 로그에서 웹 애플리케이션을 시작하면 다음과 같은 메시지가 표시됩니다.

11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom MessageInterpolator of type
 org.springframework.validation.beanvalidation.LocaleContextMessageInterpolator 
11:04:07,402 DEBUG [org.hibernate.validator.internal.engine.ConfigurationImpl] - 
Setting custom ConstraintValidatorFactory of type org.springframework .validation.beanvalidation.SpringConstraintValidatorFactory

보시다시피, 내가 원하는 ResourceBundleMessageInterpolator가 아닙니다. LocaleContextMessageInterpolator입니다.

나중에 내가 유효성을 검사하려고 할 때 Spring 메시지 소스가 아니라 ValidationMessages.properties에서 메시지를 받는다.

11:08:09,397 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
ValidationMessages not found.
11:08:09,413 DEBUG [org.hibernate.validator.resourceloading.PlatformResourceBundleLocator] - 
org.hibernate.validator.ValidationMessages found.

application-context.xml에서 볼 수 있듯이 MessageSourceResourceBundleLocator를 사용하고 싶지만 사용 된 이유는 무엇입니까? PlatformResourceBundleLocator

어떤 아이디어?

해결법

  1. ==============================

    1.ResourceBundleMessageInterpolator와 MessageSourceResourceBundleLocator Bean을 혼자서 선언 할 필요는 없으며, messageSource를 제공 ​​할 때 LocalValidatorFactoryBean에 의해 생성된다.

    ResourceBundleMessageInterpolator와 MessageSourceResourceBundleLocator Bean을 혼자서 선언 할 필요는 없으며, messageSource를 제공 ​​할 때 LocalValidatorFactoryBean에 의해 생성된다.

    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
     </bean>
    

    (그것은 두건의 밑에 이것을한다 :)

    public void setValidationMessageSource(MessageSource messageSource) {
        this.messageInterpolator = HibernateValidatorDelegate.buildMessageInterpolator(messageSource);
    }
    
    // (...)
    
    
    private static class HibernateValidatorDelegate {
    
        public static MessageInterpolator buildMessageInterpolator(MessageSource messageSource) {
            return new ResourceBundleMessageInterpolator(new MessageSourceResourceBundleLocator(messageSource));
        }
    }
    

    따라서 간단한 bean 정의를 사용하면 동일한 디버그 출력을 얻게됩니까? "validator"ref는 어디에 사용합니까? 예를 들어 를 사용해야 할 수도 있습니다.

  2. from https://stackoverflow.com/questions/11225023/messageinterpolator-in-spring by cc-by-sa and MIT license