2009-12-10 35 views
19

Tôi đang cố gắng viết validators trong khuôn khổ Spring MVC, nhưng có một thiếu sót rõ ràng trong tài liệu. Khi gọi qua một lỗi tới đối tượng Errors, hầu hết các phương thức đều mong đợi một tham số String có tên là errorCode. Những errorCodes, nếu tôi hiểu chính xác phục vụ như là stand in cho các thông báo lỗi cụ thể. Nhưng tôi không thể cho cuộc sống tìm ra nơi các mã này được ánh xạ tới.Mã lỗi xác thực mùa xuân MVC được giải quyết ở đâu?

Đây là ví dụ về những gì tôi đang đề cập đến từ Javadoc của Spring MVC;

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."); 
     } 
    } 
} 

Mọi người có thể khai sáng cho tôi không?

Trả lời

15

Tôi đang sử dụng trình phân giải thư mặc định.

Trong dispatcher-servlet.xml tôi, tôi có

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

và sau đó ở cấp cao nhất của thư mục lớp học của tôi, tôi có một tập tin văn bản gọi là "messages.properties" có chứa ánh xạ như thế này:

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

Nếu bạn muốn sử dụng MessageCodesResolver tùy chỉnh, bạn có thể triển khai giao diện MessageCodeResolver và sau đó xác định trình phân giải của bạn cho một bộ điều khiển đã cho như sau:

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

Hiện không có cách nào để xác định một tuỳ chỉnh MessageCodeResolver trên toàn cầu; có một số enhancement request for that here. Một cách tiếp cận sử dụng thừa kế bean để làm cho tất cả các bean điều khiển kế thừa từ một định nghĩa bean điều khiển, được mô tả here.

+0

Cảm ơn bạn đã cung cấp thông tin, điều này mang lại cho tôi đủ để sử dụng trình xác thực của tôi. Nhưng trong sự quan tâm của việc học những gì tôi sẽ làm gì nếu tôi muốn viết lại trong một MessageCodeResolver tùy chỉnh, nơi mà tôi sẽ đi đâu? Ngoài ra chỉ dành cho javadoc của ResourceBundleMessageSource thịnh vượng là http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/context/support/ResourceBundleMessageSource.html. –

+1

Nếu bạn muốn sử dụng MessageCodeResolver tùy chỉnh, bạn có thể gán cho một bộ điều khiển đã cho. Một cách tiếp cận, sau đó, là sử dụng thừa kế bean để làm cho tất cả các bean điều khiển kế thừa từ một định nghĩa bean điều khiển, như được mô tả ở đây: http://forum.springsource.org/showthread.php?t=46336 Hiện tại không có cách nào để xác định một MessageCodeResolver tùy chỉnh trên toàn cầu; có một yêu cầu nâng cao cho điều đó ở đây: https://jira.springsource.org/browse/SPR-5187 –

+1

Để tham khảo, tính năng tùy chỉnh toàn cục 'MessageCodeResolver' cuối cùng đã được triển khai trong Spring 3.1 (2011). Xem thêm [SPR-6506] (https://jira.spring.io/browse/SPR-6506). – vallismortis

3

Chúng được giải quyết bằng MessageSourceMessagesCodeResolver của bạn.

Here là phần có liên quan trong cuốn hướng dẫn tham khảo:

Xuất ra thông điệp tương ứng với lỗi xác nhận là điều cuối cùng chúng ta cần phải thảo luận. Trong ví dụ chúng tôi đã trình bày ở trên, chúng tôi đã từ chối tên và trường tuổi. Nếu chúng tôi sẽ xuất thông báo lỗi bằng cách sử dụng một MessageSource, chúng tôi sẽ làm như vậy bằng cách sử dụng mã lỗi mà chúng tôi đã cung cấp khi từ chối trường ('tên' và 'tuổi' trong trường hợp này). Khi bạn gọi (trực tiếp hoặc gián tiếp, sử dụng lớp ValidationUtils) rejectValue hoặc một trong các phương thức từ chối khác từ giao diện Errors, triển khai cơ bản sẽ không chỉ đăng ký mã bạn đã chuyển, mà còn một số mã lỗi bổ sung.

+0

Nơi nào bạn xác định những gì MessageCodeResolver sử dụng không? –

+0

một cá thể mặc định (DefaultMessageCodesResolver) được sử dụng nếu bạn không chỉ định một. Bạn chỉ cần đăng ký một MessageSource và sẽ được sử dụng tự động. –

+0

Làm thế nào để bạn đăng ký một MessageSource? Tôi thấy messageCodesResolver là thuộc tính bean. Nhưng có cách nào để thiết lập một MessageCodeResolver là phổ quát trên toàn bộ ứng dụng? –

1

Đối với một số lý do nếu bạn muốn giải quyết các thông điệp trong điều khiển tương tự như hình thức: lỗi jsp thẻ thì bạn có thể làm như sau:

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

Tôi muốn chỉ ra rằng MessageSource có thể được @Autowired trong bộ điều khiển – leojh

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