5

JBoss AS 7 を使用して、web.xml の代わりに Java コードを使用して Servlet 3.0 コンテナーを構成しようとしています。私の問題は、コンテキスト ルート ("/") にマップされたサーブレットを登録すると、デフォルトのサーブレットが優先され、代わりにリクエストを処理することです。ServletContextListener と ServletContainerInitializer の両方を試しましたが、うまくいきませんでした。

試行 1: ServletContextListener

@WebListener
public class AppInitializer implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();

        ServletRegistration.Dynamic homeServlet = context.addServlet("homeServlet", new HomeServlet());
        homeServlet.addMapping("/");
        homeServlet.setLoadOnStartup(1);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        // Do nothing.
    }
}

試行 2: ServletContainerInitializer

public class AppInitializer2 implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> classes, ServletContext context) throws ServletException {
        ServletRegistration.Dynamic homeServlet = context.addServlet("homeServlet", new HomeServlet());
        homeServlet.addMapping("/");
        homeServlet.setLoadOnStartup(1);
    }
}

追加情報

  • マッピングを から に変更する//example、サーブレットは新しいパスへのリクエストを正しく処理します。
  • Java コードではなく web.xmlを介してサーブレットを登録すると、/サーブレットはコンテキスト ルートへの要求を正しく処理します。

では… DefaultServlet によってオーバーライドされることなく、Java コードを介してコンテキスト ルートにサーブレットを登録するにはどうすればよいでしょうか?

ありがとう!

4

1 に答える 1

6

JBoss AS 7.1.1 と Spring MVC 3.2.3.RELEASE を使用しても同じ問題が発生しました。これに基づいてWebApplicationInitializer javadocs :

Tomcat での「/」へのマッピング

Apache Tomcat は内部 DefaultServlet を「/」にマップします。Tomcat バージョン <= 7.0.14 では、このサーブレット マッピングをプログラムでオーバーライドすることはできません。7.0.15 では、この問題が修正されています。「/」サーブレット マッピングのオーバーライドも、GlassFish 3.1 で正常にテストされています。

サーブレット コンテナーがアップグレードまたは置き換えられない限り、web.xml なしでサーブレットをコンテキスト ルートにマップする方法はないと思います。JBoss AS 7.1.1.Final は JBoss Web 7.0.13 を使用しているように見えますが、これは Tomcat 7.0.13 と一致すると思われます。また、DefaultServlet コンテキストのルート マッピングをプログラムでオーバーライドすることは、バージョン 7.0.15 以降まで明らかに不可能です。

それまでの間、web.xml でサーブレット マッピングを定義するか、コンテキスト ルートにマップしないでください。残念。

于 2013-06-01T20:31:35.183 に答える