2013-07-03 19 views
11

Gần đây tôi đã nâng cấp lên mùa xuân 3.2 và nhận thấy rằng AnnotationMethodHandlerAdapter đã không được chấp nhận vì lợi ích của RequestMappingHandlerAdapter. Vì vậy, tôi cấu hình lại để sử dụng các lớp học mới, hoàn thành với một tùy chỉnh MessageConverter tôi cần. Tất cả tốt và tốt.thay thế AnnotationMethodHandlerAdapter bằng RequestMappingHandlerAdapter issue

Tuy nhiên, khi cố gắng để đạt một URL được hỗ trợ bởi một chú thích Controller, tôi nhận được một lỗi:

[java] javax.servlet.ServletException: No adapter for handler [[email protected]]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler 
[java]  at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1128) 
[java]  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:903) 
[java]  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856) 

Khi gỡ lỗi dispatcher, và đặc biệt, phương pháp Dispatcher.getHandlerAdapter(), nó tìm HandlerAdapter của tôi, nhưng AbstractHandlerMethodAdapter.supports() đó được gọi muốn một MethodHandler:

public final boolean supports(Object handler) { 
    return handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler); 
} 

và bộ điều khiển không phải là một HandlerMethod. Phương pháp hỗ trợ các AnnotatedMethodHandlerAdapter 's là .. tốt, khác nhau (và các công trình vẫn còn!)

public boolean supports(Object handler) { 
    return getMethodResolver(handler).hasHandlerMethods(); 
} 

Vì vậy, tôi dường như không thể đơn giản nâng cấp lên lớp mới ... Tôi đang thiếu một số cấu hình bổ sung, nhưng isn tài liệu không thực sự giúp tôi. Bất kỳ ý tưởng?

Cảm ơn.

Trả lời

18

Sử dụng "<mvc:annotation-driven/>" trong tập tin cấu hình mùa xuân thay vì viết thực hiện của riêng bạn WebMvcConfigurationSupport

dụ

<mvc:annotation-driven/> 
<context:component-scan base-package="com.springapp.mvc"/> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.FormHttpMessageConverter"/> 
       <bean class="org.springframework.http.converter.StringHttpMessageConverter"/> 
      </list> 
     </property> 

    </bean> 
7

Vì vậy, khi nó quay ra, chuyển đổi đơn giản định nghĩa bean không hoạt động do thực tế là RequestMappingHandlerAdapter phụ thuộc vào toàn bộ máy chủ của các thực thể được tạo và cấu hình. Mùa xuân, theo mặc định, đang sử dụng một thực thể WebMvcConfigurationSupport để làm tất cả cấu hình mặc định này, nhưng việc tạo phiên bản bean của riêng tôi không giúp ích gì bởi vì mùa xuân tạo ra riêng của nó.

Cách tiếp cận của tôi đã kết thúc là một thứ gì đó dọc theo các dòng bên dưới, nơi tôi để lại về cơ bản tất cả cấu hình mặc định của mùa xuân, nhưng sau đó thêm công cụ chuyển đổi của riêng tôi. Hạn chế duy nhất là nó chuyển đổi cấu hình xml sang javaconfig, nhưng trong trường hợp của tôi, nó là ok. Có một bài viết here mô tả một cái gì đó tương tự.

@Configuration 
public class WebConfig extends WebMvcConfigurationSupport { 

    @Bean 
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() { 
    RequestMappingHandlerAdapter handlerAdapter = super.requestMappingHandlerAdapter(); 
    handlerAdapter.getMessageConverters().add(0, getProtobufJsonMessageConverter()); 
    return handlerAdapter; 
    } 
+4

Đối với những gì nó có giá trị này http được ghi nhận: // docs .spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/new-in-3.1.html # new-in-3.1-handler-method-controller-processing –

1
import org.springframework.context.annotation.Configuration; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; 
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter; 
@Configuration 
public class WebConfig extends WebMvcConfigurationSupport { 
    @Override 
    protected RequestMappingHandlerAdapter createRequestMappingHandlerAdapter() { 
    return new XXXXRequestMappingHandlerAdapter(); 
    } 
}