web-dev-qa-db-ja.com

spring-webのspring-boot自動設定を防ぐ方法は?

spring-bootを使用し、RestTemplateを使用するために、Maven pomにspring-web依存関係を追加しました。

ここで、springはEmbeddedServletContextを初期化しようとします。どうすれば防ぐことができますか?

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
30
membersound

参考:この使用例は Spring Boot Reference Guide に記載されています。

すべてのSpringアプリケーションがWebアプリケーション(またはWebサービス)である必要はありません。 mainメソッドでコードを実行するだけでなく、使用するインフラストラクチャを設定するためにbootstrap Springアプリケーションを実行する場合は、Spring BootのSpringApplication機能を使用すると簡単です。 SpringApplicationは、Webアプリケーションが必要かどうかに応じてApplicationContextクラスを変更します。これを支援するために最初にできることは、サーブレットAPIの依存関係をクラスパスから除外することです。それができない場合(たとえば、同じコードベースから2つのアプリケーションを実行している場合)、SpringApplication.setWebEnvironment(false)を明示的に呼び出すか、applicationContextClassプロパティを設定できます(Javaを使用) APIまたは外部プロパティ付き)。ビジネスロジックとして実行するアプリケーションコードは、CommandLineRunnerとして実装し、@Bean定義としてコンテキストにドロップできます。

application.properties:

spring.main.web-environment=false   #webEnvironment property
32
Tim

最初のトリック:

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

第二:

@Configuration
@EnableAutoConfiguration(exclude = WebMvcAutoConfiguration.class)
public class Application {
26
Artem Bilan

Web環境を無効にする従来の方法(@Timの回答で述べられている)は、Spring Boot 2.xでも機能しますが、新しい推奨される方法は、次のプロパティを設定することです

spring.main.web-application-type=none

ここ は許容値を定義する列挙型です

8
geoand

これはSpring Boot 2.xで動作します

public static void main(String[] args) {
   new SpringApplicationBuilder(MyApplication.class)
            .web(WebApplicationType.NONE)
            .build()
            .run(args);
}
8
Andy

私はSpring Boot 2.06でReactive Web Appを構築しようとしていて、このエラーが発生しました:

org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.Java:155) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.Java:542) ~[spring-context-5.0.10.RELEASE.jar:5.0.10.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.Java:140) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.Java:754) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.Java:386) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:307) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1242) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.Java:1230) [spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at com.vogella.springboot2.Test3Application.main(Test3Application.Java:10) [main/:na]
Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.Java:204) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.Java:178) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.Java:152) ~[spring-boot-2.0.6.RELEASE.jar:2.0.6.RELEASE]
    ... 8 common frames omitted

このリンクは問題を説明し、2つの提案を提供しました:

https://vividcode.io/Fixing-Spring-Boot-error-Unable-to-start-ServletWebServerApplicationContext-due-to-missing-ServletWebServerFactory-bean/

私はSpring Bootで新しいSpring WebFluxアプリケーションを構築していました。 start.spring.ioからプロジェクトテンプレートをダウンロードした後、サードパーティの依存関係をいくつか追加し、アプリケーションを起動しようとしました。その後、エラーorg.springframework.context.ApplicationContextException:ServletWebServerFactory Beanが見つからないためServletWebServerApplicationContextを起動できませんでした...に遭遇しました。

エラーメッセージは、解決策の手がかりです。 Unable to start ServletWebServerApplicationContextですが、私のプロジェクトはWebFluxを使用しており、サーブレットベースのSpring Web MVCプロジェクトではなく、リアクティブWebプロジェクトです。

Springのソースコードをデバッグすることで、原因を見つけることができました。 org.springframework.boot.SpringApplicationのdeduceWebApplicationTypeメソッドでは、Spring Web MVCのクラスがCLASSPATHに存在しない場合にのみ、WebアプリケーションタイプがWebApplicationType.REACTIVEに設定されます。

根本原因が特定されると、解決策は簡単です。次のいずれかを実行できます。

Maven依存関係を更新してspring-webmvcを除外するか、以下に示すようにWebアプリケーションタイプをWebApplicationType.REACTIVEに明示的に設定します。

@SpringBootApplication class MyApplication
fun main(args: Array<String>) {
    val app = SpringApplication(MyApplication::class.Java)
    app.webApplicationType = WebApplicationType.REACTIVE
    app.run(*args)
}

残念ながら、これらのソリューションはどちらも私にとってはうまくいきませんでした。代わりに、geoandの応答を調整し、これをapplication.propertiesに追加しました。

spring.main.web-application-type=reactive

出来上がり!問題は解決しました!

2
FoggyDay