2015-04-22 11 views
20

Używam spring-boot i dodano zależność spring-web w maven pom, aby skorzystać z RestTemplate.Jak zapobiec automatycznej konfiguracji wiosennego rozruchu w sieci wiosennej?

Teraz wiosna próbuje zainicjować EmbeddedServletContext. Jak mogę temu zapobiec?

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 

Odpowiedz

25

Dla porównania: ten przypadek użycia jest udokumentowana w Spring Boot Reference Guide:

Nie wszystkie aplikacje Wiosną trzeba być aplikacjami sieciowymi (lub usługami sieciowymi). Jeśli chcesz wykonać jakiś kod w metodzie main, ale także załadować aplikację Spring, aby skonfigurować infrastrukturę do użycia, to jest to łatwe dzięki funkcjom Spring Boot w wersji SpringApplication. SpringApplication zmienia swoją klasę ApplicationContext w zależności od tego, czy uważa, że ​​potrzebuje aplikacji internetowej, czy nie. Pierwszą rzeczą, którą możesz zrobić, aby to ułatwić, jest pozostawienie zależności API serwletów poza ścieżką klas. Jeśli nie możesz tego zrobić (np. Uruchamiasz 2 aplikacje z tej samej podstawy kodu), możesz jawnie wywołać SpringApplication.setWebEnvironment(false) lub ustawić właściwość applicationContextClass (za pośrednictwem interfejsu API Java lub z właściwościami zewnętrznymi). Kod aplikacji, który chcesz uruchomić jako logikę biznesową, można zaimplementować jako CommandLineRunner i zamienić w kontekst jako definicję @Bean.

application.properties:

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

Pierwszy trick:

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

drugie:

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

Próbowałem '@EnableAutoConfiguration (exclude = WebMvcAutoConfiguration.class, EmbeddedServletContainerAutoConfiguration.class})' ale nadal ten sam błąd ... Byłoby miło, gdyby automatyczna konfiguracja 'spring-web' mogła zostać wyłączona przez adnotację bez konieczności modyfikacji moja główna metoda startowa ... – membersound

+0

Chociaż Twoja sugestia działa, dziękuję! Ale w każdym razie dobrze byłoby wyłączyć tylko adnotację autokonfiguracji. – membersound

+6

"Spring.main.web_environment = false' jest jednak lepszy ... Nie ma potrzeby kodowania żadnej Javy :-) –

1

Chociaż sposób dziedzictwo wyłączanie środowiska internetowego (jak wspomniano w @ odpowiedź Tima) nadal działa w Wiosna Boot 2.x, jednak nowa preferowanym sposobem jest ustawienie następującą właściwość

spring.main.web-application-type=none

Here jest wyliczenia definiujący dozwolone wartości

+0

Strona, do której prowadzi łącze, nie podaje jednak żadnych informacji na temat właściwości 'spring.main.web-application-type' (kiedy to piszę), nawet nie ma poprawnych wartości. Googling dla 'Spring WebApplicationType API' ujawni, że prawidłowe wartości to' servlet', 'reactive' i' none' (z tak małą literą, jak sądzę). – ddekany

+0

@ddekany Musieli zmienić dokumentację. Dzięki za wskazanie tego! – geoand

Powiązane problemy