Wie zu verwenden TomcatEmbeddedServletContainerFactory mit einem AbstractAnnotationConfigDispatcherservletinitializer
Ich habe 'TomcatEmbeddedServletContainerFactory' aus dem Spring-Boot-Projekt erzeugen kann, einen embedded Tomcat-Instanz.
Ich habe bereits eine Reihe von "traditionellen" Spring (Java-basierend) Konfiguration-Klassen und eine 'AbstractAnnotationConfigDispatcherservletinitializer Umsetzung für die Einrichtung eines root-Anwendung, die Kontext-und controller-context
public class IntegrationTestDispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[]{ServiceModuleConfiguration.class};
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[]{WebModuleConfiguration.class };
}
}
Nun versuche ich zum erstellen einer Tomcat-Instanz mit
TomcatEmbeddedServletContainerFactory tomcatFactory = new TomcatEmbeddedServletContainerFactory("/", 8080);
tomcatFactory.getEmbeddedServletContainer(???)
getEmbeddedServletContainer() erwartet eine ServletContextInitializer von Spring boot-und jetzt bin ich stecken mit der überbrückung, die zu meiner Konfiguration Klassen.
Ist Spring Boot ein tomcat-Fabrik gebaut, für die Unterstützung dieses? Wenn dem so ist,irgendwelche Beispiele gibt?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
EmbeddedServletContainerFactory
wirklich Paare mitEmbeddedWebApplicationContext
(nicht dieAnnotationConfigWebApplicationContext
erhalten Sie vonAbstractAnnotationConfigDispatcherServletInitializer
). Wenn Sie bauen wollen, eine war-Datei dann Ihre beste option angesichts der einfachen Natur der Initialisierung ist die VerwendungSpringApplicationServletInitializer
statt, z.B.Wenn Sie nicht möchten, dass eine war-Datei (wie vorgeschlagen, in den Kommentaren, und wenn ich mehr darüber nachdenken), einfach ein
SpringApplication
verwendetEmbeddedServletContainerFactory
wenn es denkt, dass Sie versuchen, zu erstellen eine webapp (oder verwenden Sie den builder wie im code oben).SpringServletContainerInitializer
treten in zur Initialisierung der web-Anwendung. Ich bin mit einemAnnotationConfigEmbeddedWebApplicationContext
mit einem bean-definition für einenEmbeddedServletContainerFactory
. Der container selbst beginnt, aber ich denke, um für die oben genanntenIntegrationTestDispatcherServletInitializer
dieSpringServletContainerInitializer
ausgeführt werden?ServletContextInitializer
ist nicht zu helfen, und wenn Sie wollen, dass den eingebetteten container, die Sie wahrscheinlich nicht wollen, eine war-Datei. Warum nicht einfachSpringApplication
oder den generator direkt?SpringApplicationBuilder builder = new SpringApplicationBuilder(WebModuleConfiguration.class,ServiceModuleConfiguration.class); builder.contextClass(AnnotationConfigEmbeddedWebApplicationContext.class); builder.application().run();
Dies ist das Booten Rahmen, jedoch sieht es nicht aus, das gibt mir ein arbeiten DispatcherServlet setup. Aber die Frage ist nun, wenn ich hatte, um es zu registrieren manuell wie ich es tun würde, mitAbstractDispatcherServletInitializer
bräuchte ich Zugriff auf den Anwendungskontext mit dem controller Bohnen? Ich sehe nicht, wie man bekommen würde, die aus dem generator/ - Anwendung?DispatcherServlet
zu eigen Ihrem Kontext, die Sie benötigen, um erstellen Sie eine@Bean
dieser Art und legen Sie es in Ihrem Anwendungskontext. Sollte nicht eine große Sache? N. B. obwohl, zu bewahren, die Anwendung der context-Hierarchie aus der original-app, die Sie verwenden müssenSpringApplicationBuilder
(oder gleichwertig) wie im obigen Beispiel. OTOH, vielleicht Ihre ursprüngliche app nicht nötig, die Hierarchie (die meisten apps nicht).EmbeddedServletContainerFactory
werden in derAnnotationConfigEmbeddedWebApplicationContext
. Dann setzenbuilder.sources(ServiceModuleConfiguration.class,TomcatContainerFactoryConfiguration.class).child(WebModuleConfiguration.class, DispatcherServletConfiguration.class);
führt zu der situation, dass dieDispatcherServlet
konfiguriertDispatcherServletConfiguration
wird nicht mehr geladen.@EnableAutoConfiguration
statt, wenn die Verkabelung, alles selbst.Mit etwas mehr debugging und einige mehr input von Dave der richtige Ansatz ist explizit Holen Sie das Kind-generator-Instanz und rufen Sie die Methode run (). Dies wird starten Sie den Kontext richtig.
WebConfiguration
enthält dieDispatcherServlet
bean.TomcatContainerFactoryConfiguration
enthält dieTomcatEmbeddedServletContainerFactory
bean