web-dev-qa-db-ja.com

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

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がリクエストマッピングの前にコンテキストルートを追加しない原因となっているものが足りません。

142
CorreyS

なぜあなたはあなた自身の解決策を転がそうとしていますか。 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チェックを行いますが、デフォルトは""であるため常に失敗し、コンテキストを""に設定して自分の設定を上書きします)。

325
M. Deinum

もしあなたがSpring Bootを使っているのであれば、Veanの初期化を通してサーバーのプロパティを設定する必要はありません。

代わりに、基本設定に1つの機能が利用できる場合は、それをapplicationと呼ばれる "properties"ファイルに設定できます。これは、アプリケーション構造のsrc\main\resourcesの下に置く必要があります。 "properties"ファイルは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

27
Abhishek Shah

Spring Boot 2.0.0をお使いの場合

server.servlet.context-path
15
magemello

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

ここでこの答えを参照してください。 https://stackoverflow.com/a/43856300/4449859

7
abdel

正しいプロパティは

server.servlet.path

dispatcherServletのパスを構成する

そして

server.servlet.context-path

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

7
Michael Simons

application.propertiesAPI_CONTEXT_ROOT=/therootpathとして設定できます。

そして、私たちは下記のようにJavaクラスでそれにアクセスします

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

Spring Boot 1.5では:

application.propertiesに次のプロパティを追加します。

server.context-path=/demo

注:/demoはコンテキストパスのURLです。

1
Piyush Anjikar

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>
0
Gondri

ポートとコンテキストパスを簡単に追加して、[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 
0
Ghulam Murtaza