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


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.propertiesAPI_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.