コントローラーを備えた 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/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/page1
http://localhost:8080/app/page2
しかし問題は、新しいページを追加するたびに DispatcherServlet へのマッピングを追加する必要があることです。たとえば、ページ 3 を追加するには、Controller を作成する必要があります
@Controller("/app/page3")
と
ディスパッチャ サーブレット マッピングを追加する dispatcher.addMapping("/app", "/app/page1", "/app/page2", **"/app/page3"**);
この最後のステップは避けたいと思います。
dispatcher.addMapping("/app/*");
理想的ですが、上で述べたように機能していません。
何が欠けているか分かりますか?