[java] 스프링 부트 애플리케이션에 컨텍스트 경로 추가

프로그래밍 방식으로 Spring Boot 응용 프로그램 컨텍스트 루트를 설정하려고합니다. 컨텍스트 루트의 이유는 앱에 액세스 localhost:port/{app_name}하고 모든 컨트롤러 경로가 앱에 추가되기를 원 하기 때문입니다.

다음은 웹 응용 프로그램의 응용 프로그램 구성 파일입니다.

@Configuration
public class ApplicationConfiguration {

  Logger logger = LoggerFactory.getLogger(ApplicationConfiguration.class);

  @Value("${mainstay.web.port:12378}")
  private String port;

  @Value("${mainstay.web.context:/mainstay}")
  private String context;

  private Set<ErrorPage> pageHandlers;

  @PostConstruct
  private void init(){
      pageHandlers = new HashSet<ErrorPage>();
      pageHandlers.add(new ErrorPage(HttpStatus.NOT_FOUND,"/notfound.html"));
      pageHandlers.add(new ErrorPage(HttpStatus.FORBIDDEN,"/forbidden.html"));
  }

  @Bean
  public EmbeddedServletContainerFactory servletContainer(){
      TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
      logger.info("Setting custom configuration for Mainstay:");
      logger.info("Setting port to {}",port);
      logger.info("Setting context to {}",context);
      factory.setPort(Integer.valueOf(port));
      factory.setContextPath(context);
      factory.setErrorPages(pageHandlers);
      return factory;
  }

  public String getPort() {
      return port;
  }

  public void setPort(String port) {
      this.port = port;
  }
}

메인 페이지의 인덱스 컨트롤러는 다음과 같습니다.

@Controller
public class IndexController {

  Logger logger = LoggerFactory.getLogger(IndexController.class);

  @RequestMapping("/")
  public String index(Model model){
      logger.info("Setting index page title to Mainstay - Web");
      model.addAttribute("title","Mainstay - Web");
      return "index";
  }

}

응용 프로그램의 새 루트는에 있어야 localhost:12378/mainstay하지만 여전히에 있습니다 localhost:12378.

Spring Boot가 요청 매핑 전에 컨텍스트 루트를 추가하지 않는 원인이 무엇입니까?



답변

왜 자신의 솔루션을 롤링하려고합니까? 스프링 부트는 이미이를 지원합니다.

아직 application.properties파일 이 없으면에 파일을 추가 하십시오 src\main\resources. 해당 특성 파일에서 2 개의 특성을 추가하십시오.

server.contextPath=/mainstay
server.port=12378

업데이트 (Spring Boot 2.0)

Spring MVC와 Spring WebFlux의 지원으로 인해 Spring Boot 2.0 contextPath에서 다음과 같이 변경되었습니다.

server.servlet.contextPath=/mainstay

그런 다음 사용자 정의 서블릿 컨테이너에 대한 구성을 제거 할 수 있습니다. 컨테이너에서 일부 사후 처리를 수행해야하는 경우 EmbeddedServletContainerCustomizer구성에 구현을 추가 할 수 있습니다 (예 : 오류 페이지 추가).

기본적으로 application.properties서비스 내부의 속성 은 기본값으로 제공하며 application.properties제공하는 아티팩트 옆에 다른 속성 을 사용 하거나 JVM 매개 변수 ( -Dserver.port=6666)를 추가 하여 항상 속성을 무시할 수 있습니다 .

참조 안내서 특히 속성 섹션 도 참조 하십시오.

클래스 ServerProperties는를 구현합니다 EmbeddedServletContainerCustomizer. 의 기본값은 contextPath입니다 "". 코드 샘플에서는에 contextPath직접 설정하고 있습니다 TomcatEmbeddedServletContainerFactory. 다음으로 ServerProperties인스턴스는이 인스턴스를 처리하고 경로에서로 재설정합니다 "". ( 이 줄null검사를하지만 기본값은 ""항상 실패하고 컨텍스트를 설정하여 사용자 ""를 재정의합니다).


답변

Spring Boot를 사용하는 경우 Vean 초기화를 통해 서버 속성을 구성 할 필요가 없습니다.

대신 기본 구성에 사용할 수있는 기능 중 하나가 있으면 “속성”파일에서 설정 될 수 application있으며이 파일은 src\main\resources애플리케이션 구조에 있어야합니다 . “properties”파일은 두 가지 형식으로 제공됩니다

  1. .yml

  2. .properties

구성을 지정하거나 설정하는 방법은 형식마다 다릅니다.

특정 경우 확장명을 사용하기로 결정 하면 다음 구성 설정 .properties으로 파일이 호출 application.properties됩니다.src\main\resources

server.port = 8080
server.contextPath = /context-path

OTOH, .yml확장자 (ie application.yml) 를 사용하기로 결정한 경우 , 다음 형식 (ie YAML)을 사용하여 구성을 설정해야합니다 .

server:
    port: 8080
    contextPath: /context-path

Spring Boot의 일반적인 속성은 아래 링크를 참조하십시오.

https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html


답변

Spring Boot 2.0.0을 사용하는 경우 다음을 사용하십시오.

server.servlet.context-path


답변

“server.context-path”또는 “server.servlet.context-path”[springboot 2.0.x에서 시작] 속성은 내장 Tomcat과 같은 내장 컨테이너에 배포하는 경우에만 작동합니다. 예를 들어 외부 Tomcat과의 전쟁으로 응용 프로그램을 배포하는 경우 이러한 속성이 적용되지 않습니다.

https://stackoverflow.com/a/43856300/4449859 에서이 답변을 참조 하십시오


답변

올바른 속성은

server.servlet.path

DispatcherServlet의 경로를 구성하는 방법

server.servlet.context-path

그 아래에 애플리케이션 컨텍스트의 경로를 구성하십시오.


답변

속성 파일의 간단한 항목을 사용하여 컨텍스트 루트 경로를 변경할 수 있습니다.

application.properties

### Spring boot 1.x #########
server.contextPath=/ClientApp

### Spring boot 2.x #########
server.servlet.context-path=/ClientApp


답변

우리는 그것을 설정할 수 application.properties
API_CONTEXT_ROOT=/therootpath

그리고 우리는 아래에 언급 된 것처럼 Java 클래스에서 액세스합니다.

@Value("${API_CONTEXT_ROOT}")
private String contextRoot;