programing

spring-web 용 스프링 부트 자동 설정을 방지하는 방법

procenter 2023. 3. 14. 23:31
반응형

spring-web 용 스프링 부트 자동 설정을 방지하는 방법

사용하고 있다spring-boot라고 덧붙였습니다.spring-web이용하기 위해 maven pom의 의존성RestTemplate.

이제 봄은 초기화를 시도한다.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 」를 참조해 주세요.

모든 스프링 애플리케이션이 웹 애플리케이션(또는 웹 서비스)일 필요는 없습니다.에서 일부 코드를 실행하는 경우mainSpring 어플리케이션을 부트스트랩하여 사용할 인프라스트럭처를 셋업할 수 있습니다.이렇게 하면,SpringApplicationSpring Boot의 특징입니다.aSpringApplication변경하다ApplicationContext웹 어플리케이션이 필요한지 여부에 따라 클래스가 달라집니다.이를 지원하기 위해 가장 먼저 할 수 있는 것은 servlet 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 {

기존 웹 환경 비활성화 방법(@Tim's Answer에서 설명한 바와 같이)은 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을 사용하여 리액티브 웹 앱을 구축하려고 했는데 다음 오류가 발생했습니다.

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

이 링크는 문제를 설명하고 다음 두 가지 제안을 제시했습니다.

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 오류가 발생하였습니다.Application Context Exception:ServletWebServerFactory bean이 없어 ServletWebServerApplicationContext를 시작할 수 없습니다...

에러 메세지가 해결의 힌트입니다.Servlet Web Server Application Context를 시작할 수 없습니다라고 표시되어 있습니다만, 제 프로젝트는 Web Flux를 사용하고 있으며, 서블릿 기반의 Spring Web MVC 프로젝트가 아닌 반응형 웹 프로젝트입니다.

스프링 소스 코드로 디버깅하면 원인을 찾을 수 있습니다.이 메서드에서 duce Web Application은org.springframework.boot 유형입니다.Spring Application 웹 응용 프로그램 유형은 Web Application Type으로 설정됩니다.CLASSPATH에 Spring Web MVC 클래스가 존재하지 않는 경우에만 반응합니다.

근본 원인을 파악하면 해결이 쉬워집니다.다음 중 하나가 가능합니다.

spring-webmvc를 제외하도록 Maven 종속성을 업데이트하거나 웹 응용 프로그램 유형을 WebApplicationType으로 설정합니다.아래 그림과 같이 명시적으로 반응합니다.

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

유감스럽게도 두 솔루션 모두 제게는 효과가 없었습니다.지오앤드의내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거, 내 거.application.properties:

spring.main.web-application-type=reactive

부라! 문제가 해결됐어!

언급URL : https://stackoverflow.com/questions/29800584/how-to-prevent-spring-boot-autoconfiguration-for-spring-web

반응형