2012-04-30 20 views
8

Trước tiên, hãy để tôi giải thích rằng tôi đang sử dụng Spring MVC 3.1.1 và xác thực Hibernate 4.2.0. Tôi đang sử dụng chú thích xác thực cho các biểu mẫu khác nhau trong ứng dụng Spring của mình. Kể từ khi ứng dụng của tôi cần phải được bản địa hoá, tôi đã sử dụng một bó tài nguyên cho các tin nhắn xác nhận của tôi trông hơi như thế này:Làm cách nào để làm cho Spring hiển thị các thông báo dựa trên gói xác thực khác nhau cho cùng một trình xác nhận hợp lệ trên một lớp?

# ValidationMessages.bundle 
FieldMatch=Password and confirmation must match. 

Định nghĩa lớp tương ứng cho thông điệp này trông như thế này:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Tôi có gói tài nguyên tùy chỉnh này được thiết lập trong appContext.xml của tôi và thư của tôi đang được hiển thị trên biểu mẫu mà không có bất kỳ vấn đề nào.

Đây là tình trạng khó xử của tôi. Có một yêu cầu mới mà tôi phải xác nhận nhiều lĩnh vực phù hợp. Ngay bây giờ tôi chỉ xác nhận rằng hai trường mật khẩu khớp nhau. Bây giờ yêu cầu của tôi là tôi phải xác nhận địa chỉ email. Tôi biết đây là một yêu cầu ngớ ngẩn, nhưng tôi không thể thay đổi nó. Vì vậy, bây giờ định nghĩa lớp sẽ trông giống như sau:

@FieldMatch.List({ 
    @FieldMatch(first = "password", second = "passwordConfirmation") 
    @FieldMatch(first = "email", second = "emailConfirmation") 
}) 
public class RegistrationForm { 
    // ... 
} 

Rõ ràng, gói tài nguyên hiện tại của tôi sẽ không hoạt động vì tôi cần hai thư riêng biệt (một cho mỗi trận đấu). Tôi đã thử sử dụng message="{emails.must.match}" và sau đó xác định thông báo đó trong gói tài nguyên, nhưng nó không bao giờ thực sự hiển thị thông báo, nó chỉ hiển thị văn bản thực tế {email.must.match}. Vì vậy, sau khi tất cả những gì giải thích, câu hỏi của tôi là đơn giản: Làm thế nào tôi có thể làm cho mỗi một trong những validator FieldMatch ở cấp lớp có một thông điệp khác nhau được định nghĩa trong một gói tài nguyên để nó có thể được bản địa hóa?

Cảm ơn bạn đã giúp đỡ!

[EDIT] Đối với những người tò mò, this là trình xác thực FieldMatch mà tôi đang sử dụng.

CẬP NHẬT 2012/05/23 Dưới đây là những người khác định nghĩa bean đã yêu cầu:

<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
    <property name="basenames"> 
     <list> 
      <value>ErrorBundle</value> 
      <value>ForgotPasswordBundle</value> 
      <!-- etc etc --> 
     </list> 
    </property> 
</bean> 

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

Trả lời

1

Các trường hợp như thế này thường bật một thứ mà OP không đưa vào câu hỏi. Tôi đoán điều này là bởi vì nếu giải pháp đơn giản hoặc gây ra bởi một cái gì đó OP nghĩ rằng nó đã được gây ra bởi, họ sẽ không có một vấn đề. Không phán xét; Tôi đã làm xong.

Vì vậy, tôi trình bày các bước khắc phục sự cố thay vì giải pháp hoàn chỉnh, bởi vì dựa trên những gì bạn đã nói, nó sẽ hoạt động.

Trước tiên, hãy kiểm tra kỹ xem đó có phải là vấn đề nội suy kỳ lạ hay không và thử message="{emails-must-match}".

Nếu điều đó không hoạt động, có vẻ như bạn đã sử dụng ValidationMessages.properties đang hoạt động. Tôi sẽ quay lại điều đó (xóa <property name="validationMessageSource" ref="messageSource"/> khỏi cấu hình trình xác thực) và xem bạn có thể nhận được message="{emails.must.match}" để làm việc với emails.must.match được xác định trong ValidationMessages.properties hay không. Nếu vẫn không hoạt động, hãy quay lại thư mặc định bạn đã sử dụng phím FieldMatch và xem bạn có nhận được thông báo đó cho cả hai điều kiện lỗi hay không.

Điều đó sẽ giúp bản địa hóa vấn đề.

+0

Điều này đặt tôi vào đúng con đường. Gói của tôi thực sự không được đặt tên 'ValidationMessages.properties' nhưng thay vào đó' ValidationBundle.properties' - khi tôi đổi tên tệp, mọi thứ đã hoạt động và tôi nhận được chuỗi thích hợp. Chúc mừng! –

0

chìa khóa của thông điệp trong bó tài nguyên của bạn là gì? Nó phải là "emails.must.match" (nghĩa là, không có dấu ngoặc nhọn cần thiết cho thuộc tính message của ràng buộc).

+0

Tôi đã đảm bảo tên khớp chính xác mà không có may mắn. Nó chỉ hiển thị phiên bản dấu ngoặc nhọn. –

+1

Bạn có thể đăng cách bạn thiết lập trình xác thực (ngữ cảnh ứng dụng) không? Bạn đang sử dụng 'LocalValidatorFactoryBean'? Đồng thời, gói tin nhắn của bạn nằm ở đâu? Có phải tên là ValidationMessages.properties không? – Gunnar

1

FieldMatch đang sử dụng trình xác thực JSR-303 (javax.validation.Validator), không phải trình xác thực Spring (org.springframework.validation.Validator). Bạn đã định cấu hình nguồn tin nhắn như:

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

và dĩ nhiên tương ứng messageSource?

+0

xem các cập nhật ở trên :) –