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
参考:この使用例は 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
最初のトリック:
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 {
Web環境を無効にする従来の方法(@Timの回答で述べられている)は、Spring Boot 2.xでも機能しますが、新しい推奨される方法は、次のプロパティを設定することです
spring.main.web-application-type=none
ここ は許容値を定義する列挙型です
これはSpring Boot 2.xで動作します
public static void main(String[] args) {
new SpringApplicationBuilder(MyApplication.class)
.web(WebApplicationType.NONE)
.build()
.run(args);
}
私は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つの提案を提供しました:
私は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
出来上がり!問題は解決しました!