2013-07-03 5 views
11

Ich habe kürzlich auf Frühling 3.2 aktualisiert und festgestellt, dass AnnotationMethodHandlerAdapter zugunsten veraltet worden war. Also habe ich neu konfiguriert, um die neue Klasse zu verwenden, komplett mit einer benutzerdefinierten MessageConverter, die ich brauche. Alles in Ordnung und gut.Ersetzen von AnnotationMethodHandlerAdapter durch RequestMappingHandlerAdapter-Problem

Wenn jedoch eine URL von einer kommentierten Controller unterstützt zu schlagen versucht, erhalte ich eine Fehlermeldung:

[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) 

Wenn der Dispatcher debuggen, und insbesondere die Dispatcher.getHandlerAdapter() Methode, es ist meine HandlerAdapter zu finden, aber die AbstractHandlerMethodAdapter.supports() die aufgerufen wird, will eine MethodHandler:

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

und der Controller ist kein HandlerMethod. Die AnnotatedMethodHandlerAdapter ‚s Unterstützung Methode ist .. gut, andere (und funktioniert immer noch!)

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

So kann ich einfach offenbar nicht auf die neue Klasse ein Upgrade ... Ich bin einige zusätzliche Konfiguration fehlen, aber die Dokumentation isn Es hilft mir nicht wirklich. Irgendwelche Ideen?

Danke.

Antwort

18

Use "<mvc:annotation-driven/>" im Frühjahr Konfigurationsdatei statt eine eigene Implementierung von WebMvcConfigurationSupport Schreiben

Beispiel

<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

So wie es sich herausstellt, funktioniert das einfache Umschalten der Bean-Definition nicht, da der RequestMappingHandlerAdapter von einer ganzen Menge von Entitäten abhängt, die erstellt und konfiguriert werden. Spring verwendet standardmäßig eine WebMvcConfigurationSupport-Entität, um all diese Standardkonfiguration auszuführen. Die einfache Erstellung einer eigenen Bean-Version hilft jedoch nicht, da spring eine eigene Bean-Version erstellt.

Mein Ansatz endete etwas wie unten, wo ich im Grunde die gesamte Konfiguration bis Frühjahr Standard verlassen, aber dann meinen eigenen Konverter hinzugefügt. Der einzige Nachteil ist, dass es die xml-Konfiguration auf javaconfig umstellt, aber in meinem Fall ist es in Ordnung. Es gibt einen Artikel here, der etwas Ähnliches beschreibt.

@Configuration 
public class WebConfig extends WebMvcConfigurationSupport { 

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

Für das, was es wert ist das dokumentiert http: // docs .spring.io/spring-framework/docs/3.1.x/spring-framework-reference/html/neu-in-3.1.html # neu-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(); 
    } 
}