프로그래밍 방식으로 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;