Spring Bootアプリケーションのコンテキストルートをプログラムで設定しようとしています。コンテキストルートの理由は、アプリがlocalhost:port/{app_name}
からアクセスされ、すべてのコントローラパスがそれに追加されるようにすることです。
これがWebアプリのアプリケーション設定ファイルです。
@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がリクエストマッピングの前にコンテキストルートを追加しない原因となっているものが足りません。
なぜあなたはあなた自身の解決策を転がそうとしていますか。 Spring-bootはすでにそれをサポートしています。
まだ持っていない場合は、application.properties
ファイルをsrc\main\resources
に追加します。そのプロパティファイルに、2つのプロパティを追加します。
server.contextPath=/mainstay
server.port=12378
UPDATE(Spring Boot 2.0)
Spring Boot 2.0以降(Spring MVCとSpring WebFluxの両方のサポートにより)、contextPath
は次のように変更されました。
server.servlet.contextPath=/mainstay
その後、カスタムサーブレットコンテナの設定を削除できます。コンテナで後処理を行う必要がある場合は、設定にEmbeddedServletContainerCustomizer
実装を追加できます(たとえばエラーページを追加するため)。
基本的にapplication.properties
内のプロパティはデフォルトとして機能します。提供するアーティファクトの隣に別のapplication.properties
を使用するか、JVMパラメータを追加することで(-Dserver.port=6666
)、いつでもそれらをオーバーライドできます。
リファレンスガイド 、特に プロパティ の節も参照してください。
クラス ServerProperties
は、EmbeddedServletContainerCustomizer
を実装します。 contextPath
のデフォルトは""
です。コードサンプルでは、contextPath
を直接TomcatEmbeddedServletContainerFactory
に設定しています。次にServerProperties
インスタンスがこのインスタンスを処理し、パスから""
にリセットします。 ( この行 はnull
チェックを行いますが、デフォルトは""
であるため常に失敗し、コンテキストを""
に設定して自分の設定を上書きします)。
もしあなたがSpring Bootを使っているのであれば、Veanの初期化を通してサーバーのプロパティを設定する必要はありません。
代わりに、基本設定に1つの機能が利用できる場合は、それをapplication
と呼ばれる "properties"ファイルに設定できます。これは、アプリケーション構造のsrc\main\resources
の下に置く必要があります。 "properties"ファイルは2つのフォーマットで利用可能です
.yml
.properties
構成を指定または設定する方法は、形式によって異なります。
あなたの特定のケースでは、あなたが拡張子.properties
を使うことに決めたならば、あなたは以下の構成設定でapplication.properties
の下にsrc\main\resources
と呼ばれるファイルを持つでしょう
server.port = 8080
server.contextPath = /context-path
OTOHさん、.yml
拡張子(つまりapplication.yml
)を使うことにした場合、次のフォーマット(つまり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
にAPI_CONTEXT_ROOT=/therootpath
として設定できます。
そして、私たちは下記のようにJavaクラスでそれにアクセスします
@Value("${API_CONTEXT_ROOT}")
private String contextRoot;
Spring Boot 1.5では:
application.properties
に次のプロパティを追加します。
server.context-path=/demo
注:/demo
はコンテキストパスのURLです。
server.contextPath =/mainstay
私はJBOSSの1つの戦争ファイルがあれば私のために働く。それぞれが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>
ポートとコンテキストパスを簡単に追加して、[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