0

コントローラーを備えた Spring MVC アプリがあります。

@Controller("/app")

@Controller("/app/page1")

@Controller("/app/page2")

AppInitializer があります。

public class AppInitializer implements WebApplicationInitializer {

  @Override
  public void onStartup(ServletContext servletContext) throws ServletException {
    WebApplicationContext context = getContext();

    DispatcherServlet servlet = new DispatcherServlet(context);
    ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/app/*");
  }

  private AnnotationConfigWebApplicationContext getContext() {
    ... prepare app context
  }
}

このアプリを実行すると、アクセスできます

http://localhost:8080/app

しかし

http://localhost:8080/app/page1でエラーが発生する

警告: 「DispatcherServlet1」という名前の DispatcherServlet で、URI [/app/page1] の HTTP 要求のマッピングが見つかりません

http://localhost:8080/app/page2でエラーが発生する

警告: 「DispatcherServlet1」という名前の DispatcherServlet で、URI [/app/page2] の HTTP 要求のマッピングが見つかりませんでした

このように DispatcherServlet に厳密なマッピングを追加することで、これを修正できます

DispatcherServlet servlet = new DispatcherServlet(context);
ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet1", servlet);
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/app", "/app/page1", "/app/page2");

すべてのページが正常に動作します:

http://localhost:8080/app

http://localhost:8080/app/page1

http://localhost:8080/app/page2

しかし問題は、新しいページを追加するたびに DispatcherServlet へのマッピングを追加する必要があることです。たとえば、ページ 3 を追加するには、Controller を作成する必要があります

@Controller("/app/page3")

ディスパッチャ サーブレット マッピングを追加する dispatcher.addMapping("/app", "/app/page1", "/app/page2", **"/app/page3"**);

この最後のステップは避けたいと思います。

dispatcher.addMapping("/app/*");理想的ですが、上で述べたように機能していません。

何が欠けているか分かりますか?

4

1 に答える 1