2010-11-15 37 views
9

Tôi đang cố gắng ghi đè ResourceBundleLocator mặc định trong xác nhận ngủ đông 4.1. Cho đến nay nó hoạt động hoàn hảo, nhưng các ví dụ duy nhất về cách sử dụng của nó bao gồm mã java để khởi tạo ValidationFactory.Hibernate Validator, tùy chỉnh ResourceBundleLocator và Spring

Khi sử dụng ứng dụng web có xác thực ngủ đông được tự động định cấu hình (chỉ có xác thực ngủ đông phù hợp * tệp .jar sẽ tồn tại và được sử dụng tự động). Làm thế nào tôi có thể thay thế ResourceBundleLocator trong kịch bản đó? Tôi không thấy bất kỳ cách nào của specyfing tài nguyên tùy chỉnh của tôi ResourceBundleLocator trong bất kỳ thuộc tính hoặc file applicationContext.xml.

Trả lời

18

Phương pháp ma thuật thực hiện công việc bắt buộc là LocalValidatorFactoryBean#setValidationMessageSource(MessageSource messageSource).

Trước hết, hợp đồng của phương pháp này: -

Chỉ định một mùa xuân MessageSource tùy chỉnh để giải quyết xác nhận bài viết, thay vì dựa vào mặc định JSR-303 của "ValidationMessages.properties" bó trong classpath. Điều này có thể ám chỉ đến một số ngữ cảnh mùa xuân được chia sẻ "nội dung" của tin nhắn mùa xuân hoặc cho một số thiết lập MessageSource đặc biệt cho chỉ nhằm mục đích xác thực.

LƯU Ý: Tính năng này yêu cầu Hibernate Validator 4.1 hoặc cao hơn trên đường dẫn lớp học . Tuy nhiên, bạn vẫn có thể sử dụng nhà cung cấp xác thực khác nhau nhưng ResourceBundleMessageInterpolator của Hibernate Validator phải có thể truy cập được trong cấu hình .

Chỉ định thuộc tính này hoặc "messageInterpolator", không phải cả hai. Nếu bạn muốn xây dựng một MessageInterpolator tùy chỉnh , hãy xem xét bắt nguồn từ ResourceBundleMessageInterpolator Hibernate Validator và đi qua trong một mùa xuân MessageSourceResourceBundleLocator khi xây dựng xen vào của bạn.

Bạn có thể chỉ định message.properties tùy chỉnh của bạn (hoặc .xml) bằng cách gọi phương pháp này ... như thế này ...

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()); 
     } 
    } 

} 

Outupt:Custom Message:- MyNotNullMessage

4

Dưới đây là một giải pháp nếu bạn muốn kết hợp các thông điệp xác nhận ngủ đông hiện hữu và tin nhắn xác nhận tùy chỉnh:

<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> 

(thấy Web MVC framework Validation sectionConfiguring a Bean Validation Provider trong Tài liệu về mùa xuân)

+0

nơi sử dụng trình xác thực đậu trong cấu hình dựa trên chú thích (Cấu hình Java hoàn chỉnh không có XML). – karthi

Các vấn đề liên quan