복붙노트

[SPRING] Hibernate Validator, 사용자 정의 ResourceBundleLocator 및 Spring

SPRING

Hibernate Validator, 사용자 정의 ResourceBundleLocator 및 Spring

최대 절전 모드 유효성 검사 4.1에서 기본 ResourceBundleLocator를 재정의하려고합니다. 지금까지는 완벽하게 작동하지만 사용법의 유일한 예는 ValidationFactory를 인스턴스화하는 Java 코드를 포함합니다.

봄철 웹 응용 프로그램을 사용할 때 최대 절전 모드 유효성 검사가 자동으로 구성됩니다 (적절한 최대 절전 모드 유효성 검사 * .jar 파일 만 있어야하며 자동으로 사용됩니다). 어떻게 그 시나리오에서 ResourceBundleLocator를 대체 할 수 있습니까? 모든 사용자 정의 ResourceBundleLocator를 모든 특성 또는 applicationContext.xml 파일에서 지정하는 방법이 없습니다.

해결법

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

    1.필요한 작업을 수행하는 매직 메소드는 LocalValidatorFactoryBean # setValidationMessageSource (MessageSource messageSource)입니다.

    필요한 작업을 수행하는 매직 메소드는 LocalValidatorFactoryBean # setValidationMessageSource (MessageSource messageSource)입니다.

    우선, 방법의 계약 : -

    이 메소드를 호출하여 사용자 정의 message.properties (또는 .xml)를 지정할 수 있습니다.

    my-beans.xml

    <bean name="validator"
        class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource">
            <ref bean="resourceBundleLocator"/>
        </property>
    </bean>
    
    <bean name="resourceBundleLocator" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basenames">
            <list>
                <value>META-INF/validation_errors</value>
            </list>
        </property>
    </bean>
    

    validation_errors.properties

    javax.validation.constraints.NotNull.message=MyNotNullMessage
    

    Person.java

        class Person {
        private String firstName;
        private String lastName;
    
        @NotNull
        public String getFirstName() {
            return firstName;
        }
        public void setFirstName(String firstName) {
            this.firstName = firstName;
        }
        public String getLastName() {
            return lastName;
        }
        public void setLastName(String lastName) {
            this.lastName = lastName;
        }
    }
    

    BeanValidationTest.java

        public class BeanValidationTest {
    
        private static ApplicationContext applicationContext; 
    
        @BeforeClass
        public static void initialize() {
            applicationContext = new ClassPathXmlApplicationContext("classpath:META-INF/spring/webmvc-beans.xml");
            Assert.assertNotNull(applicationContext);
        }
    
        @Test
        public void test() {
            LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
            Validator validator = factory.getValidator();
            Person person = new Person();
            person.setLastName("dude");
            Set<ConstraintViolation<Person>> violations = validator.validate(person);
            for(ConstraintViolation<Person> violation : violations) {
                System.out.println("Custom Message:- " + violation.getMessage());
            }
        }
    
    }
    

    출력 : 사용자 지정 메시지 : - NotNull 메시지

  2. ==============================

    2.기존의 최대 절전 모드 유효성 검증 메시지와 사용자 정의 유효성 검증 메시지를 혼합하려는 경우 다음과 같은 솔루션이 있습니다.

    기존의 최대 절전 모드 유효성 검증 메시지와 사용자 정의 유효성 검증 메시지를 혼합하려는 경우 다음과 같은 솔루션이 있습니다.

    <mvc:annotation-driven validator="validator" />
    <bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
        <property name="validationMessageSource" ref="messageSource"/>
    </bean>
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basenames" value="i18n,iso-i18n,org.hibernate.validator.ValidationMessages" />
        <property name="useCodeAsDefaultMessage" value="true" />
    </bean>
    

    (Web MVC 프레임 워크 유효성 검사 섹션과 Spring 문서에서 Bean 유효성 검사 공급자 구성하기 참조)

  3. ==============================

    3.귀하의 답변에 따라 @ Lu55, 고마워, 내 문제를 해결 !!

    귀하의 답변에 따라 @ Lu55, 고마워, 내 문제를 해결 !!

    방금 Configuration 클래스로 변환했는데 다른 사람이 필요로 할 때를 대비하여 여기에 게시하고 있습니다.

    가져 오기 세부 사항 : ReloadableResourceBundleMessageSource를 사용하여 저에게 효과적 이었지만 ResourceBundleMessageSource를 사용하여 작동하지 않았습니다. 왜 그런지 모르겠습니다.

    @Configuration
    public class ErrorConfig {
    
        @Bean
        public Validator validatorFactory (MessageSource messageSource) {
            LocalValidatorFactoryBean validator =  new LocalValidatorFactoryBean();
            validator.setValidationMessageSource(messageSource);
            return validator;
        }
    
        @Bean
        public MessageSource messageSource() {
            ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
            bean.addBasenames("classpath:org.hibernate.validator.ValidationMessages","classpath:message");
            bean.setDefaultEncoding("UTF-8");
            return bean;
        }
    }
    

    내 리소스 폴더 안에 message.properties 파일이 있습니다.

  4. from https://stackoverflow.com/questions/4186556/hibernate-validator-custom-resourcebundlelocator-and-spring by cc-by-sa and MIT license