2012-02-07 17 views
5

Tôi đang gặp một số nhầm lẫn trong việc sử dụng và mục đích của DataBinder và ConversionService của Spring liên quan đến yêu cầu web ràng buộc đối với các đối tượng mô hình. Điều này đã phát sinh vì gần đây tôi đã cố gắng sử dụng xác thực JSR-303 bằng cách thêm.Sự khác nhau giữa DataBinder và ConversionService trong Spring

Trước đó tôi đã sử dụng:

<bean 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="mypackage.GlobalWebBindingInitializer" /> 
    </property> 
</bean> 

này là tốt bởi vì tôi muốn có một DataBinder toàn cầu mà có thể được sử dụng bởi nhiều Controller. Trong lớp GlobalWebBindingInitialzer thực hiện một số các:

binder.registerCustomEditor(MyClass.class, new PropertyEditorSupport(MyClass.class) 

Tuy nhiên tôi muốn sử dụng các chú thích @Valid và do đó gia tăng. Tác dụng phụ của điều này là bean AnnotationMethodHandlerAdapter ở trên đã được định nghĩa là một phần của hướng chú thích và vì vậy dữ liệu toàn cầu của tôi được bỏ qua.

Vì vậy, bây giờ tôi đã tạo ra lớp này:

public class MyClassConverter implements Converter<String, MyClass> 

Tôi bối rối. Nếu tôi muốn sử dụng tôi có nên sử dụng dịch vụ chuyển đổi thay vì dữ liệu không?

Trả lời

3

Trước đây, ràng buộc dữ liệu của Spring được sử dụng để chuyển đổi dữ liệu thành javabeans. Nó dựa chủ yếu vào JavaBean PropertyEditors để thực hiện chuyển đổi.

Spring 3.0 added new and different support cho chuyển đổi và định dạng. Một số thay đổi bao gồm gói "core.convert" và gói "định dạng" theo tài liệu "có thể được sử dụng như các lựa chọn thay thế đơn giản hơn cho PropertyEditors".

Bây giờ, để trả lời câu hỏi của bạn, có, có vẻ như bạn đang đi đúng hướng. Bạn có thể tiếp tục sử dụng một trong hai, nhưng để làm cho một câu chuyện dài ngắn trong nhiều trường hợp bạn sẽ có thể sử dụng một công cụ chuyển đổi thay vì một chất kết dính dữ liệu.

Tài liệu về cách thêm xác thực is available online.

1

Tiếp tục để trả lời ở trên PropertyEditors (đặc biệt PropertyEditorSupport) đều không đề an toàn được đặc biệt cần thiết trong một môi trường Web trong đó mỗi yêu cầu được phục vụ trong một thread riêng biệt. Về mặt lý thuyết, PropertyEditors sẽ mang lại kết quả không thể đoán trước trong điều kiện đồng thời cao.

Nhưng không chắc chắn lý do Spring sử dụng PropertyEditors ngay từ đầu. Có thể nó có nghĩa là cho các môi trường không đa luồng và ngày trước SpringMVC?

EDIT:

Mặc dù, PropertyEditorSupport không giống sợi mùa xuân an toàn đảm bảo nó được sử dụng một cách an toàn chủ đề. Ví dụ, initBinder() được gọi là mỗi khi ràng buộc dữ liệu là cần thiết. Tôi đã sai về khái niệm rằng nó chỉ được gọi một lần khi bộ điều khiển được khởi tạo.

@InitBinder 
public void initBinder(WebDataBinder binder) { 

    logger.info("initBinder() called."); 

    DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm"); 
    dateFormat.setLenient(false); 

    binder.registerCustomEditor(Date.class, new CustomDateEditor(
      dateFormat, false)); 
} 

Đây là nhật ký "initBinder() được gọi". có thể hiển thị nhiều lần bất cứ khi nào sự ràng buộc xảy ra.