2013-08-21 9 views
7

Eclipse Mavenプラグインを使用してJava EE 7プロジェクトを作成しています。私の問題は、SerlvetContextListenerを実装するクラスが呼び出されないアプリケーションを実行するときです。この問題の原因は何ですか?ServletContextListenerが呼び出されていません

@WebListener 
    public class ApplicationContextListener implements ServletContextListener{ 

    @Override 
    public void contextInitialized(ServletContextEvent sce) 
    { 
     Request request = new HttpRequest(sce); 
     new Thread (request).start(); 
     HibernateUtil.getSessionFactory(); 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) 
    { 

    } 

} 

のweb.xml:web.xmlに

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
    http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1"> 
<listener>com.kyrogaming.AppServletContextListener</listener> 
<!-- Jersey Mapping --> 
<servlet> 
    <servlet-name>jersey-servlet</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>com.sun.jersey.config.property.packages</param-name> 
     <param-value>com.kyrogaming.webservices</param-value> 
    </init-param> 
</servlet> 
<servlet-mapping> 
    <servlet-name>jersey-servlet</servlet-name> 
    <url-pattern>/service/*</url-pattern> 
</servlet-mapping> 
<!-- end Jersey Mapping --> 

<welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
</welcome-file-list> 

答えて

3

あなたも<listener-class>を指定する必要があります。

<listener> 
     <listener-class> 
       com.kyrogaming.AppServletContextListener 
     </listener-class> 
    </listener> 
+20

これは間違いです。 Java EE 6以降、 'web.xml'エントリを必要とせずに' @ WebListener'を使って登録できます。タイムリーに追いついてください。Java EE 6は、2009年12月から既にリリースされています。これは間違ってこの間違った答えを間違ってアップした人にも当てはまります。 – BalusC

+0

ありがとう、@ BalusC、何が問題になるのだろうか? – JNL

+2

これまでに提供された情報に基づいて質問に答えることはできません。私が推測すると、そのリスナーは実際にランタイムクラスパスに終わったことはありません。 – BalusC

11

web.xmlでmetadata-complete = "false"を使用すると、この問題が解決されました。

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1" 
    metadata-complete="false"> 
10

JNLさんとテッド・ゴダードの答えを要約すると:サーブレットコンテナによってロードするのServletContextListener(または、そのようなServletContextAttributeListenerやServletRequestAttributeListenerなどの他のリスナー)のために

を、あなたが指示する必要がありますそれについての容器。 described in the API docsとして、これを行うには3つの方法があります。

1)は、デプロイメント・ディスクリプタ(web.xmlファイル)でそれを宣言します。

<listener> 
    <listener-class> 
     com.kyrogaming.AppServletContextListener 
    </listener-class> 
</listener> 

2)または(「注を参照してください@WebListenerと、そのクラスに注釈を付けます注釈について」

3)またはは、addListener()のようなServletContextのメソッドを使用してプログラマチックに登録します。アノテーションに関する

方法1)と3)は常に動作します。方法2)(注釈)が機能するには、クラスパス内のクラスをスキャンして注釈付きリスナークラスを見つけるようにサーブレットコンテナを設定する必要があります。

webapp独自のクラス(WEB-INF/classes)は常にスキャンされるため、注釈付きのクラスが常に検出されます。ただし、web.xmlに属性metadata-complete="true"(デフォルトはfalse)が含まれている場合は、ライブラリ(WEB-INF/libのJAR)はスキャンされません。 Java Servlet Specification Version 3.0の第8章「注釈と差し替え可能性」を参照してください。

したがって、コンテナがJARの注釈付きクラスを見つけることができるようにするには、web.xmlがmetadata-complete="false"に設定されているか、まったく設定されていないことを確認してください。

これを設定すると、アプリケーションの起動が遅くなることがあります。たとえばWhat to do with annotations after setting metadata-complete="true" (which resolved slow Tomcat 7 start-up)?を参照してください。


残念ながら、質問のServletContextListenerがロードされないのはなぜですか?質問のweb.xmlはmetadata-completeではありません。つまり、デフォルトでfalseになっているため、クラスパススキャンが有効になっています。多分他の問題があります。このチェックリストはうまくいけばそれを見つけるのに役立ちます。

2

記録のために、私はServletContextListenerが呼び出されていない可能性がある(そして悪質な)原因を追加します。

これはjava.lang.LinkageErrorがある場合、つまりjavax.servlet-api<scope>provided</scope>を追加することを忘れた場合に発生します。 リスナーインスタンスが作成されますが、contextInitializedおよびcontextDestroyedメソッドではなく、静的部分のみが実行されます。

リスナーのインスタンス化中にリンケージ・エラーが発生しないため、サーブレットを起動したときにのみ検出されます。

関連する問題