2011-08-26 44 views
5

Dự án của tôi bao gồm các bộ điều khiển không được chú thích cũ hơn cùng với bộ điều khiển dựa trên chú thích mới hơn.<mvc: chú thích hướng /> với bộ điều khiển không được chú thích

Tôi đang sử dụng các lọ mùa xuân mới nhất (3.0.5) và trong bộ điều phối-servlet.xml của mình có <mvc:annotation-driven />.

Vấn đề là <mvc:annotation-driven /> làm cho ánh xạ yêu cầu (thông qua thuộc tính tên của hạt điều khiển trong dispatcher-servlet.xml) cho bộ điều khiển không chú thích của tôi không hoạt động ... mỗi lần tôi chuyển yêu cầu đến điều khiển un-chú thích tôi nhận được một thông báo lỗi như:

org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher' 

làm thế nào tôi có thể giữ cho các bộ điều khiển un-chú thích như họ đang có nhưng nói mùa xuân để nhận ra bản đồ của họ (kiểu cũ)?

Tôi đang tìm các giải pháp có thay đổi tối thiểu đối với mã Java của các trình điều khiển mà tôi đã có.

Cảm ơn!

Trả lời

6

Khi bạn thêm <mvc:annotation-driven /> vào cấu hình của mình, nó sẽ thay thế bộ ánh xạ xử lý mặc định và bộ điều hợp xử lý và các giá trị mặc định đó là bộ xử lý các bộ điều khiển kiểu cũ.

Bạn có 2 tùy chọn. Điều đầu tiên cần thử là xóa <mvc:annotation-driven />. Bạn vẫn có thể sử dụng bộ điều khiển có chú thích mà không cần điều này. Nó thêm các tính năng bổ sung như hỗ trợ Jackson JSON, nhưng nếu bạn không cần những tính năng bổ sung đó thì bạn không cần đến nó. Vì vậy, hãy thử ứng dụng của bạn mà không cần <mvc:annotation-driven /> và xem ứng dụng đó có hoạt động hay không.

Nếu không, bạn có thể khôi phục ánh xạ và bộ điều hợp cho bộ điều khiển cũ của mình. Bạn đã không nói như thế nào điều khiển của bạn sử dụng để có URL của họ ánh xạ, nhưng hãy thử thêm này để cấu hình bạn:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
<bean class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping"/> 

Nếu bạn sử dụng SimpleUrlHandlerMapping, sau đó cần được làm việc rồi.

Bạn cũng cần phải thêm HandlerAdapter lại:

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

Đừng chỉ cần thêm chúng trong một cách mù quáng. Hãy thử chúng riêng lẻ, và xem những gì các thiết lập tối thiểu là để có được bộ điều khiển cũ của bạn làm việc cùng với những người mới.

+0

Cảm ơn bạn vì câu trả lời rất hữu ích này. Các bộ điều khiển cũ của tôi đã sử dụng phương thức name = url để ánh xạ, vì vậy tôi đã thêm BeanNameUrlHandlerMapping vào tệp dispatcher-servlet.xml của mình và nó hoạt động lại ngay bây giờ.Sau câu trả lời của bạn, tôi đã dành chút thời gian để đọc về ánh xạ xử lý và bộ điều hợp xử lý (không biết về chúng). Bây giờ câu hỏi của tôi là trong Spring 3, các ánh xạ xử lý và bộ điều hợp xử lý nào được tự động định nghĩa? Tôi đoán DefaultAnnotationHandlerMapping & AnnotationMethodHandlerAdapter nhưng có ai khác không? Bạn có thể hướng dẫn tôi đến nơi nó được đề cập trong tài liệu và/hoặc mã không? Cảm ơn một lần nữa! – rapt

6

Tôi thấy rằng bằng cách giải mã mvc: chú thích hướng vào sự thay thế thực tế của nó, nó dễ dàng hơn để tìm ra.

<mvc:annotation-driven /> phát nổ như thế này:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<!-- Configures a validator for spring to use --> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="messageInterpolator"> 
     <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" /> 
    </property> 
</bean> 

<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 

Khi sự kỳ diệu đã biến mất, tôi đã nhận lỗi này cố gắng để tải một "Cũ" điều khiển: javax.servlet.ServletException: No adapter for handler [or[email protected]

Từ thời điểm đó, tôi đã thêm

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

Và tất cả các trình điều khiển cũ của tôi đều hoạt động.

+0

Cảm ơn bạn, Brad, vì giải pháp của bạn. Nó làm việc cho tôi. Thú vị là nếu tôi đặt "mvn: annotation-driven" vào cấu hình, sau đó tôi nhận được thông báo lỗi "Ứng dụng có chuyển hướng vòng lặp", nhưng phiên bản phát nổ đang hoạt động OK. –

+0

Tôi đã sử dụng SimpleUrlHandlerMapping cho các bộ điều khiển cũ. Với mùa xuân 2.5. Thêm thông tin sau trong khi bật cả chú thích và bộ điều khiển cũ để hoạt động giống như một miếng bánh! \t . Cảm ơn! – JackDev

+0

Có ai muốn giải thích tại sao giải pháp của bạn hoạt động không? Có phải vì Spring đến với một bộ bộ điều hợp mặc định và xác định "AnnotationMethodHandlerAdapter" đơn giản đã ghi đè cài đặt bộ điều hợp mặc định? – JackDev

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