프로그래밍 방식으로 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”파일은 두 가지 형식으로 제공됩니다
- 
.yml - 
.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;
