0

かなり単純なアプリの開発中に問題が発生しました。どこから来たのか全くわかりません。

基本的に、Java アプリケーションからページを読み込もうとしているときに、アプリ全体のデータ (My DAO) の初期化を目的としたリスナーを有効にすると、Tomcat から 404 エラーが発生します。web.xml の行をコメントアウトしてリスナーを無効にすると、サーブレット呼び出しで 500 が返されます (リスナー クラスによる初期化がないため、init() メソッドの NPE によってトリガーされます)。

それがどこから来るのか、何か考えはありますか?

ここにコードの抜粋があります

web.xml

    ...
    <listener>
        <listener-class>com.mypackage.InitialisationDAOFactory</listener-class>
    </listener>
    ...
    <servlet>
        <servlet-name>NewBooking</servlet-name>
        <servlet-class>com.mypackages.NewBooking</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>NewBooking</servlet-name>
        <url-pattern>/index</url-pattern>
    </servlet-mapping>
    ...

初期化DAOFactory.java

    public class InitialisationDAOFactory implements ServletContextListener
    {
        private static final String ATT_DAO_FACTORY = "daofactory";
        private DAOFactory daoFactory;

            ...

        @Override
        public void contextInitialized(ServletContextEvent event)
        {
            ServletContext context = event.getServletContext();
            this.daoFactory = DAOFactory.getInstance();
            context.setAttribute(ATT_DAO_FACTORY, daoFactory);
        }
    }

NewBooking.java

    public class NewBooking extends HttpServlet
    {
        private static final String CONF_DAO_FACTORY = "daofactory";
    ...
        private BookingDAO = daoBooking;
        private TripDAO = daoTrip;

        public void init()
        {
            this.daoBooking = ( (DAOFactory) getServletContext().getAttribute(CONF_DAO_FACTORY)) .getBookingDAO();
            this.daoBooking = ( (DAOFactory) getServletContext().getAttribute(CONF_DAO_FACTORY)) .getBookingDAO();
        }
    ...
    }

500 は、リスナーがアクティブでなく (web.xml 内でコメントアウトされている)、daofactory が servletContext にない場合に発生し、それに到達しようとすると null が返されるため、.getBookingDAO() 呼び出しで NPU が発生します。ただし、404 がどこから来たのかはまったくわかりません。

誰もがその起源と潜在的な修正について考えを持っていますか? ありがとう

編集:アプリはTomCat 7で実行されます

編集 2: コメントに記載されているように、私は無差別に使用してページにアクセスしようとしhttp://localhost/AppName/indexていhttp://localhost/AppNameます。呼び出されるメソッドは、データを JSP に渡す doGet(request, response) である必要があります。indexweb.xmlthis.getRequestDispatcher("/WEB-INF/index.jsp").forward(request,response);

ファイルが存在し、適切な名前が付けられていることを確認しました。それ以前は適切に動作していた別のサーブレット ( と の両方doGet)doPostが、フィルターがアクティブなときに応答しなくなったことに言及する価値があるかもしれません。

4

2 に答える 2

1

リスナーは、コンテキストが開始する前に実行されています。リスナーが例外をスローすると、要求された URI に実際にはアプリケーションがないため、コンテキストが失敗し、404 だけが表示されます。catalina.out enable logging を参照して、何が起こっているかを確認してください。

于 2013-10-21T16:49:21.183 に答える
0

David Levesque と Martin Strejc が指摘したように、コンテキストが失敗する例外が原因で webapp が起動に失敗しました。

ログを調査したところ、データベース ドライバーが正しく読み込まれていないため、DAOFactory.getInstance()メソッドが失敗し、例外が伝播されたことが原因であることがわかりました。

これは完全に私のプロジェクトを最初に適切に設定しなかったことが原因だったので、質問 si がもはや関連しているかどうかはわかりません。

于 2013-10-29T15:17:52.797 に答える