1. ホーム

[解決済み】Spring Bootアプリケーションにコンテキストパスを追加する

2022-04-19 23:12:03

質問

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はすでにそれをサポートしています。

まだ持っていない場合は、"Select "セクションに 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の両方がサポートされたため)、Spring MVCとSpring WebFluxの両方がサポートされています。 contextPath は、以下のように変更されました。

server.servlet.context-path=/mainstay

その後、カスタムサーブレットコンテナの設定を削除することができます。もしコンテナに対して何らかの後処理をする必要があるのなら、 コンテナに対して EmbeddedServletContainerCustomizer の実装を設定に追加します (例えば、エラーページを追加するため)。

基本的に application.properties はデフォルトとして機能し、別の application.properties を配信するアーティファクトの横に置くか、JVM パラメータ ( -Dserver.port=6666 ).

参照 リファレンスガイド 特に プロパティ のセクションをご覧ください。

クラス ServerProperties を実装しています。 EmbeddedServletContainerCustomizer . のデフォルトは contextPath"" . あなたのコードサンプルでは contextPath を直接 TomcatEmbeddedServletContainerFactory . 次に ServerProperties インスタンスはこのインスタンスを処理し、あなたのパスからリセットして "" . ( この行 null をチェックしますが、デフォルトは "" は常に失敗し、コンテキストを "" で、あなたのものを上書きしてしまいます)。