2016-01-21 36 views
0

我有兩個小應用程序,一個使用spring-boot-starter-amqp,其他使用spring-data-hadoop-boot。我可以單獨運行它們,沒有任何問題。春季啓動AMQP和Spring Hadoop一起結束時丟失了EmbeddedServletContainerFactory bean

當我將它們結合在一起時,應用程序啓動失敗,出現異常:org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean

我的主類是非常通用的,它分開他們倆工作得很好:

@PropertySource("file:conf/app.properties") 
@SpringBootApplication 
public class Job { 
    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Job.class, args); 
    } 
} 

我在這裏丟失。 AFAIK @SpringBootApplication包含所有需要的註釋,包括自動配置和組件掃描。我沒有必要配置網絡環境,因爲我沒有使用它。爲什麼當兩個依賴關係都在類路徑中時需要執行此操作,以及如何解決這個問題?

UPDATE

我挖在春節引導代碼一點點。主要問題是SpringApplication.deduceWebEnvironment()根據類路徑中某些類的存在自動檢測應配置什麼類型的環境。

對於Web環境,正在檢查兩個類。當他們都在班級路徑中時,檢測到的網絡環境顯然需要適當的配置。

  • javax.servlet.Servlet
  • org.springframework.web.context.ConfigurableWebApplicationContext

spring-boot-starter-amqp:1.3.1.RELEASE包含ConfigurableWebApplicationContext,和spring-data-hadoop-boot:2.3.0.RELEASE-cdh5包含Servlet(在天然Hadoop的庫)。

現在,單獨運行時,上述兩個類中的一個在兩種情況下都會丟失,從而導致Web環境未設置。

但是,當我使用他們兩個 - 兩個類都可以找到。 Web環境被檢測到,誤報,並且它需要配置,我不能(也不想)提供配置。

所以現在問題是 - 我可以強制非web環境,即使當我在班級路徑中有這些類時?或者還有其他方法可以解決這個問題嗎? (除了將它們從Gradle依賴關係中排除)

+1

您使用哪種Spring Boot版本?爲什麼使用自定義屬性文件,您可以簡單地將屬性添加到默認的'application.properties'。我懷疑其中一個依賴關係牽扯到一些web相關的東西(可能是hadoop),這會觸發一些自動配置類。如果你真的不需要它,你可以在'SpringApplication'上設置'web'屬性爲false。 –

+0

我特意移動了屬性 - 這不會改變任何內容。但是你對自動配置是正確的。 – waste

回答

0

已解決。

關注此問題:How to prevent spring-boot autoconfiguration for spring-web?

我運行的應用程序如下。

@PropertySource("file:conf/app.properties") 
@SpringBootApplication 
public class Job { 
    public static void main(String[] args) throws Exception { 
     new SpringApplicationBuilder(Job.class).web(false).run(args); 
    } 
} 

解答上面的問題也建議使用屬性spring.main.web_environment=false或註釋@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)。這兩種解決方案都不適合我。只有編程解決方案適用於我的情況。

+1

排除'WebMvcAutoConfiguration'不會阻止容器停止,它只會禁用設置web mvc配置。您需要將「EmbeddedServletContainerAutoConfiguration」排除在外。因爲沒有處理屬性,因此設置屬性將不起作用,所以要麼像現在這樣排除或將網絡設置爲false。 –