2017-05-12 1 views
0

Ich baue REST-Dienste über Spring MVC in der Anwendung wandern, wo die GUI von Wicket verwaltet wird. Grundsätzlich brauche ich nur die DispatcherServlet und eine Steuerung mit @RequestMapping/@RequestBody.Wie aus AnnotationMethodHandlerAdapter zu RequestMappingHandlerAdapter

Da Dienste JSON dienen, muss ich MappingJackson2HttpMessageConverter setzen. Ich kann dies tun über AnnotationMethodHandlerAdapter und das funktioniert gut:

@Configuration 
@ComponentScan("cz.swsamuraj.wicketspring") 
public class SpringRestConfiguration { 

    @Bean 
    public AnnotationMethodHandlerAdapter annotationMethodHandlerAdapter() { 
     HttpMessageConverter<?>[] converters = { new MappingJackson2HttpMessageConverter()}; 

     AnnotationMethodHandlerAdapter adapter = new AnnotationMethodHandlerAdapter(); 
     adapter.setMessageConverters(converters); 

     return adapter; 
    } 
} 

Das Problem ist, dass AnnotationMethodHandlerAdapter ist veraltet und es wird empfohlen RequestMappingHandlerAdapter stattdessen zu verwenden.

Aber wenn ich diese Konfiguration verwenden:

@Configuration 
@ComponentScan("cz.swsamuraj.wicketspring") 
public class SpringRestConfiguration { 

    @Bean 
    public RequestMappingHandlerAdapter requestHandler() { 
     RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter(); 
     adapter.getMessageConverters().add(new MappingJackson2HttpMessageConverter()); 

     return adapter; 
    } 
} 

Ich erhalte eine Ausnahme:

javax.servlet.ServletException: No adapter for handler [[email protected]]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler 
    at org.springframework.web.servlet.DispatcherServlet.getHandlerAdapter(DispatcherServlet.java:1198) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 

Also, meine Frage ist: wie kann ich einen Handler Adapter im RequestMappingHandlerAdapter up?

Ich verbrachte einige Tage der Forschung, aber ich fand kein nützliches Beispiel für die Konfiguration RequestMappingHandlerAdapter. Alle Ratschläge sagen nur @EnableWebMvc auf die Konfiguration, aber dies ist nicht der Weg wegen dieser Koexistenz Wicket-Spring.


einfach einen vollständigen Kontext zu schaffen, ich habe ein kleines erstellbar und runnable Projekt auf Bitbucket erstellt: sw-samuraj/blog-wicket-spring-rest

+1

Überprüfen Sie diesen Link https://github.com/spring-projects/spring-boot/issues/5004 – Eljaiek

+1

Soweit ich verstehe, benötigen Sie einen einzelnen Spring-Kontext, mehrere URLs für REST-Dienste und den Rest von URLs wird durch Wicket zugeordnet. Ihr Problem besteht darin, wie Sie einen einzelnen Kontext erstellen und beide Technologien auf URLs zuordnen, die diesen Kontext teilen. Ist das richtig? –

+0

Fast korrekt. Erstens ist es nicht notwendig, nur einen * Spring * -Kontext zu haben - momentan habe ich zwei (einen für * Wicket *, einen für REST). Zweitens sollte * Wicket * diese REST-URLs (und eventuell den REST-Kontext) nicht kennen. Aber das funktioniert schon für mich. Das einzige Problem ist das im Titel (migrieren 'AnnotationMethodHandlerAdapter' zu' RequestMappingHandlerAdapter'). –

Antwort

0

ich mein Problem mit anderem Ansatz lösen konnte - mit der Nutzung von WebApplicationInitializer, war ich fähig, die @EnableWebMvc Annotation auf meine Konfigurationsklasse zu setzen und daher weder die Bean RequestMappingHandlerAdapter, noch AnnotationMethodHandlerAdapter notwendig sind. JSON funktioniert nun einwandfrei, out-of-the-box.

Konfiguration

@Configuration 
@EnableWebMvc 
@ComponentScan("cz.swsamuraj.wicketspring") 
public class SpringRestConfiguration { 
    // some additional beans needed for business logic 
} 

WebApplicationInitializer

public class WebAppInitializer implements WebApplicationInitializer { 

    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext(); 
     dispatcherContext.register(SpringRestConfiguration.class); 

     servletContext.addListener(new ContextLoaderListener(dispatcherContext)); 

     ServletRegistration.Dynamic dispatcher = 
       servletContext.addServlet("dispatcher", new DispatcherServlet(dispatcherContext)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/rest/*"); 
    } 
} 

Beispielprojekt

komplette Arbeitsbeispiel ist auf Bitbucket: blog-wicket-spring-rest

Verwandte Themen