Spring Bootアプリケーションにコンテキストパスを追加する


174

プログラムでSpring Bootアプリケーションのコンテキストルートを設定しようとしています。コンテキストルートを使用する理由は、アプリにアクセスしlocalhost:port/{app_name}、すべてのコントローラーパスを追加してほしいからです。

これは、web-appのアプリケーション構成ファイルです。

@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がリクエストマッピングの前にコンテキストルートを追加しない原因となっている何が欠けていますか?

回答:


381

なぜあなたはあなた自身の解決策を展開しようとしているのですか?Spring-bootはすでにそれをサポートしています。

まだ持っていない場合は、application.propertiesファイルをに追加しますsrc\main\resources。そのプロパティファイルで、2つのプロパティを追加します。

server.contextPath=/mainstay
server.port=12378

アップデート(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チェックを行いますが、デフォルトでは""常に失敗し、コンテキストをに設定して""オーバーライドします)。


あなたの答えは正しいですが(つまり、アプリケーションプロパティファイルでサーブレットコンテナのプロパティをカスタマイズできます)、なぜsetContextPath(path)メソッドがあるのですか、つまり、パスが強制されていない場合、それは何に適していますか?ところで、EmbeddedServletContainerCustomizerのsetContextPath(...)についても同様です
Modi

2
からのEmbeddedServletContainerCustomizerものも動作することを期待します。しかし、私はあなた自身でボルトを張ろうとするのではなく、提供されているものに行きます。あなたのソリューションは、仕事をして(?偶然)プログラムのデフォルトの動作に関係していない理由ServerPropertiesは、デフォルトが設定さcontextPathれている""(そしてそれチェックのためnullではなく""、後者オーバーライドあなたが明示的に設定。contextPath
M. Deinum

プロパティが変更されました。以下の私の回答を参照してください。
Michael Simons

5
Spring Boot 2.0のプロパティは "server.servlet.context-path"だと思います
IamVickyAV

34

Spring Bootを使用している場合、Veanの初期化を介してサーバープロパティを構成する必要はありません。

代わりに、1つの機能が基本的な構成に使用できる場合は、と呼ばれる「プロパティ」ファイルで設定できますapplication。このファイルは、src\main\resourcesアプリケーション構造の下に存在する必要があります。「プロパティ」ファイルは2つの形式で利用可能です

  1. .yml

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


22

Spring Boot 2.0.0を使用する場合:

server.servlet.context-path

2
これは、外部のTomcatにデプロイされたwarファイルには機能しません
パイス

1
私にとって、これは(春ブーツ2.1.2)に働いていなかったが、これに働いた:server.servlet.contextPath=/api
lospejosを

2
@pise、あなたは外部のTomcatの戦争ファイルのためにそれを修正する方法を知っていましたか?
mohax

11

「server.context-path」または「server.servlet.context-path」プロパティ(springboot 2.0.x以降)は、埋め込みコンテナ(例:埋め込みTomcat)にデプロイする場合にのみ機能することに注意してください。たとえば、外部のTomcatへの戦争としてアプリケーションをデプロイする場合、これらのプロパティは効果がありません。

こちらの回答をご覧くださいhttps : //stackoverflow.com/a/43856300/4449859


and warを使用springboot v2.xしてファイルとして外部Tomcatにデプロイするときに、これを設定する方法を誰かが理解しましたかtomcat v8.5
シンプルなソリューション

@abdel私が答えを探していても、外部のTomcatにwarファイルをデプロイしている場合、コンテキストパスを設定する方法はどうでしょうか。
18

試してみました。それは上記のリンクで述べられたものとまったく同じです。build-> finalName属性値をコンテキストパスに変更します。結果のwarファイルは、コンテキストパスをファイル名として使用します。これは、tomcatがコンテキストパスとして機能するために使用されます。
DriLLFreAK100

外部のtomcatでwarとして展開するために私が考えることができる唯一の方法は、warの名前があなたが求めるコンテキストと一致することを確認することです。したがって、たとえば、コンテキストを「/ xyzwebapp」にする場合は、戦争の名前をxyzwebapp.warにする必要があります。これを実現するには、pom.xmlの<build>要素に次を追加します:<finalName> xyzwebapp </ finalName>。
アブデル

9

正しいプロパティは

server.servlet.path

DispatcherServletのパスを設定する

そして

server.servlet.context-path

その下のアプリケーションコンテキストのパスを構成します。


どうもありがとうございました
hema chandra 2018

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に1つのwarファイルがある場合、私にとってはうまくいきます。それぞれが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

Spring Boot 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コマンドSpring Boot 1.Xを使用

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

javaコマンドSpring Boot 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

それは私がwindowsで実行しているのにうまくいきました。


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 = / '/'で始まる値のみが引用符で囲まれていないことに注意してください。この値はapplication.propertiesファイルに含まれます。


-1

コンテキストパスはコードに直接統合できますが、再利用できないためお勧めできません。application.propertiesファイルに書き込んでください。server.contextPath= /コードを配置したフォルダーの名前contextPath =配置したフォルダーの名前コード/注:スラッシュを注意深く監視してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.