2015-04-22 5 views
20

Ich verwende spring-boot und hinzugefügt spring-web Abhängigkeit in maven pom, RestTemplate zu verwenden.Wie verhindert man die automatische Boot-Konfiguration für Federweb?

Jetzt versucht der Frühling eine EmbeddedServletContext zu initialisieren. Wie kann ich das verhindern?

Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:133) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:474) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:686) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:957) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:946) 
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean. 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:183) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:156) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) 
    ... 8 more 

Antwort

25

Zum Vergleich: Dieser Anwendungsfall in der Spring Boot Reference Guide dokumentiert ist:

Nicht alle Federanwendungen müssen Webanwendungen (oder Webdienste) sein. Wenn Sie einen Code in einer main-Methode ausführen möchten, aber auch eine Spring-Anwendung zum Einrichten der zu verwendenden Infrastruktur starten möchten, ist dies mit den Funktionen von Spring Boot SpringApplication einfach. A SpringApplication ändert seine ApplicationContext-Klasse, je nachdem, ob sie eine Webanwendung benötigt oder nicht. Das erste, was Sie tun können, ist, die Servlet-API-Abhängigkeiten vom Klassenpfad zu lassen. Wenn Sie das nicht können (z. B. wenn Sie zwei Anwendungen von derselben Codebasis aus ausführen), können Sie explizit SpringApplication.setWebEnvironment(false) aufrufen oder die applicationContextClass-Eigenschaft festlegen (über die Java-API oder mit externen Eigenschaften). Anwendungscode, der als Ihre Geschäftslogik ausgeführt werden soll, kann als CommandLineRunner implementiert und in den Kontext als @Bean Definition eingefügt werden.

application.properties:

spring.main.web-environment=false #webEnvironment property 
21

Erster Trick:

public static void main(String[] args) throws Exception { 
    ConfigurableApplicationContext ctx = new SpringApplicationBuilder(Application.class) 
       .web(false) 
       .run(args); 
} 

Zweitens:

@Configuration 
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class) 
public class Application { 
+0

Ich habe versucht '@EnableAutoConfiguration (exclude = WebMvcAutoConfiguration.class, EmbeddedServletContainerAutoConfiguration.class})' aber immer noch gleichen Fehler ... Es wäre nett, wenn die automatische Konfiguration für 'spring-web' durch Annotation deaktiviert werden könnte ohne zu ändern meine Hauptstartermethode ... – membersound

+0

Obwohl Ihr Vorschlag funktioniert, danke! Aber trotzdem wäre es schön, nur die Annotation der Autokonfiguration zu deaktivieren. – membersound

+6

Die 'spring.main.web_environment = false' ist aber besser ... Keine Notwendigkeit, Java zu programmieren :-) –

1

Obwohl das Erbe Weg, um die Web-Umgebung der Sperrung noch (wie in @ Tim Antwort erwähnt) im Frühjahr Boot-2.x arbeitet, aber der neue bevorzugte Weg ist durch die folgende Eigenschaft Einstellung

spring.main.web-application-type=none

Here ist die ENUM, die die zulässigen Werte

definiert
+0

Die verknüpfte Seite gibt keine Informationen über die 'spring.main.web-Anwendungstyp'-Eigenschaft obwohl (wenn ich dies schreibe), nicht einmal, was die gültigen Werte sind. Googeln nach 'Spring WebApplicationType API' zeigt, dass die gültigen Werte' servlet', 'reactive' und' none' sind (mit Kleinschreibung, denke ich). – ddekany

+0

@ddekany Sie müssen die Dokumentation geändert haben. Danke, dass du das unterstrichen hast! – geoand

Verwandte Themen