web.xmlのリスナーの何が問題になっていますか?
質問
ポートレットでJBoss 4.22を使用しています。リスナータグがweb.xmlにない場合、ポートレットはロードされますが、リスナーsessionDestroyed()は(明らかに)呼び出されません。追加されたとき、ポートレットはロードされず、例外もログメッセージもありません。知っておくべき落とし穴はありますか?
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<!-- Listeners used by application -->
<listener>
<listener-class>listenerpackage.MyClassThatImplementsHttpSessionListener</listener-class>
</listener>
...Other tags...
</web-app>
コメントへの返信で、トラブルスポットを見つけるためにコードを調べてきました。私のリスナーのコンストラクターにはいくつかの問題があります。通常(リスナーとしてではなく)インスタンスは、関連するポートレット(リスナーがweb.xmlに追加されたときにロードされないもの)コンストラクターによって作成されます。これが事実であると期待できますか、またはコンテナがインスタンス自体を作成しますか?
解決
問題は、デプロイメントドキュメントで宣言されたリスナーが、そのドキュメントがロードされるときにインスタンス化されることです。私のクラスは、ポートレットによってインスタンス化されるように設計されていたため、必要な情報は利用できませんでした。
解決策は、 HttpSessionを使用することです。 バインドリスナーおよびクラスをセッションに属性として追加します。その後、セッションが無効になるとunbound()が呼び出されます。 :)
他のヒント
web.xmlでリスナーノードは正しい順序ですか? DTDに従っていないために無視されている可能性がありますか?たとえば、サーブレット、サーブレットマッピング、セッション構成はすべてリスナーの前にあることになっています。
所属していません StackOverflow