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


174

프로그래밍 방식으로 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가 요청 매핑 전에 컨텍스트 루트를 추가하지 않는 원인이 무엇입니까?

답변:


382

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

아직 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검사를하지만 기본값은 ""항상 실패하고 컨텍스트를 설정하여 사용자 ""를 재정의합니다).


대답이 정확합니다 (응용 프로그램 속성 파일로 서블릿 컨테이너 속성을 사용자 정의 할 수 있음). setContextPath (path) 메서드가있는 이유는 무엇입니까? 경로가 적용되지 않으면 무엇이 좋습니까? BTW, 동일은 EmbeddedServletContainerCustomizer에 setContextPath (...)에 간다
— 모디

2
나는 그 중 하나가 EmbeddedServletContainerCustomizer작동하기를 기대합니다 . 그러나 나는 당신 자신을 볼트로 조이지 않고 제공된 것을 갈 것입니다. 솔루션은 작업 (? 실수) 프로그래밍의 기본 동작과 관련이있다하지 않는 이유는 ServerProperties, 구성 기본값 contextPath입니다 ""(및 그것을 확인 null하지 ""후자보다 우선 명시 적으로 설정. contextPath.
— M. Deinum

속성이 변경되었습니다. 아래 답변을 참조하십시오.
— Michael Simons

5
내가 추측 봄 부팅 2.0의 속성은 "server.servlet.context 경로"입니다
— IamVickyAV

34

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


22

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

server.servlet.context-path

2
외부 바람둥이에 배치 된 war 파일에는 적용되지 않습니다.
— pise

1
나를 위해 이것은 작동하지 않았지만 (Spring Boot 2.1.2), 이것을 작동했습니다 :server.servlet.contextPath=/api
— lospejos

2
@ pise, 외부 Tomcat에서 war 파일을 수정하는 방법을 알고 있습니까?
— mohax

11

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

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


누구든지 및 ?를 war사용하여 외부 바람둥이에 파일 로 배포 할 때 이것을 구성하는 방법을 알아 냈습니다 . springboot v2.xtomcat v8.5
— 간단한 솔루션

@abdel조차도 대답을 찾고 있는데, 외부 Tomcat에 war 파일을 배포하는 경우 컨텍스트 경로를 설정하는 방법은 무엇입니까?
— 미화

나는 그것을 시도했다. 위의 링크에 명시된 것과 정확히 같습니다. 빌드-> finalName 속성 값을 컨텍스트 경로로 변경하십시오. 결과로 생성 된 war 파일은 컨텍스트 경로를 파일 이름으로 사용하며, Tomcat은 컨텍스트 경로로 사용됩니다.
— DriLLFreAK100

외부 Tomcat에서 전쟁으로 배포 할 때 생각할 수있는 유일한 방법은 전쟁 이름이 당신이 따르는 컨텍스트와 일치하는지 확인하는 것입니다. 예를 들어, 컨텍스트를 '/ xyzwebapp'로하려면 전쟁 이름을 xyzwebapp.war로 지정해야합니다. 이를 위해 pom.xml의 <build> 요소에 <finalName> xyzwebapp </ finalName>을 추가 할 수 있습니다.
— abdel

9

올바른 속성은

server.servlet.path

DispatcherServlet의 경로를 구성하는 방법

과

server.servlet.context-path

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


너무 감사합니다
— hema chandra

2

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

application.properties

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

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

1

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

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

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

1

server.contextPath = / mainstay

JBOSS에 하나의 전쟁 파일이 있으면 나를 위해 일합니다. 각각 jboss-web.xml을 포함하는 여러 war 파일 중 작동하지 않았습니다. 내용이있는 WEB-INF 디렉토리에 jboss-web.xml을 넣어야했습니다.

<?xml version="1.0" encoding="UTF-8"?>
<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/j2ee/schema/jboss-web_5_1.xsd">
    <context-root>mainstay</context-root>
</jboss-web>

1

스프링 부트 1.5 :

에 다음 속성을 추가하십시오 application.properties.

server.context-path=/demo

참고 : /demo컨텍스트 경로 URL입니다.


1

포트 및 컨텍스트 경로를 쉽게 추가하여 [src \ main \ resources] .properties 파일 및 .yml 파일에 구성을 쉽게 추가 할 수 있습니다.

application.porperties 파일 구성

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

application.yml 파일 구성

server:
port: 8084
contextPath: /context-path

스프링 부트에서 프로그래밍 방식으로 변경할 수도 있습니다.

@Component
public class ServerPortCustomizer implements     WebServerFactoryCustomizer<EmbeddedServletContainerCustomizer > {

@Override
public void customize(EmbeddedServletContainerCustomizer factory) {
    factory.setContextPath("/context-path");
    factory.setPort(8084);
}

}

다른 방법으로 추가 할 수도 있습니다

@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {SpringApplication application =     new pringApplication(MyApplication.class);
    Map<String, Object> map = new HashMap<>();
    map.put("server.servlet.context-path", "/context-path");
    map.put("server.port", "808");
    application.setDefaultProperties(map);
    application.run(args);
    }       
}

Java 명령 스프링 부트 1.X 사용

java -jar my-app.jar --server.contextPath=/spring-boot-app     --server.port=8585 

Java 명령 스프링 부트 2.X 사용

java -jar my-app.jar --server.servlet.context-path=/spring-boot-app --server.port=8585 

프로그래밍 방식으로 서버 포트를 추가 할 수도 있습니다
— Ghulam Murtaza


0

를 사용하여 설정할 수 있습니다 WebServerFactoryCustomizer. 이것은 Spring ApplicationContext를 시작하는 스프링 부트 기본 메소드 클래스에 직접 추가 할 수 있습니다.

@Bean
    public WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>
      webServerFactoryCustomizer() {
        return factory -> factory.setContextPath("/demo");
}

0

Spring Boot 2.x를 사용하고 명령 행에 컨텍스트 경로 특성을 전달하려면 다음과 같이 double //을 넣어야합니다.

--server.servlet.context-path=//your-path

그것은 창문에서 달리기를 위해 일했습니다.


0
<!-- Server port-->

server.port=8080

<!--Context Path of the Application-->

server.servlet.context-path=/ems

서버 포트는 8080입니다. 다른 포트를 원하면 8080을 바꿀 수 있습니다. 응용 프로그램 컨텍스트 경로에서 ems를 설정했습니다. 요구 사항에 따라 다른 경로를 설정할 수 있습니다
— Bordoloi Parth

1
유용한 정보입니다. 주석 대신 답변에 추가하지 않겠습니까?
— k-den

0

server.servlet.context-path = / demo이어야합니다. '/'앞에 오는 값만 따옴표로 묶지 않습니다.이 값은 application.properties 파일에 있습니다.


-1

컨텍스트 경로는 코드에 직접 통합 될 수 있지만 재사용 할 수 없으므로 권장되지 않으므로 application.properties 파일 server.contextPath = / 이름을 배치 한 폴더의 이름으로 입력하십시오. contextPath = 배치 한 폴더의 이름 코드 / 참고 : 슬래시를주의 깊게 살펴보십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.