2

Spring アノテーションを使用してコントローラーとサービスを注入する Web アプリに取り組んでいます。アプリでは、プロジェクトで作業しているユーザーがいますが、一度に 1 つのプロジェクトが 1 人のユーザーによってのみ編集されるようにする必要があるため、プロジェクトが開いている場合に保存するデータベースの「プロジェクト」テーブルに属性があります。誰。

プロジェクトを編集しているユーザーが切断したときにプロジェクトを「閉じる」ことができるようにするには、HTTPSessionListener を追加する必要があります。これは、「sessionDestroyed」イベントで、DAO サービスを呼び出してデータベース内のプロジェクトを更新することを意味します。唯一の問題は、このサービスが Spring によって注入され、取得できないことです...

私は HTTPSessionListener で @Autowired を使用しようとしましたが、うまくいきませんでした。

私の web.xml :

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:jsp="http://java.sun.com/xml/ns/javaee/jsp"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">

<!-- jsp config => automatic inclusions in all jsp files -->
<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <include-prelude>taglibs.jsp</include-prelude>
        <include-prelude>setLanguage.jsp</include-prelude>
    </jsp-property-group>
</jsp-config>
<display-name>MEANS</display-name>

<!--Spring dispatcher servlet -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.do</url-pattern><!-- detect all urls ending with ".do" -->
</servlet-mapping>

<!-- The welcome files -->
<welcome-file-list>
    <welcome-file>connection.jsp</welcome-file>
</welcome-file-list>
<session-config>
    <session-timeout>30</session-timeout><!-- the session is automatically disconnected after 30 min of inactivity -->
</session-config>
<listener>
    <listener-class>myPackages.listener.MySessionListener</listener-class>
</listener>

そして、dispatcher-servlet.xml :

 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:mvc="http://www.springframework.org/schema/mvc"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:p="http://www.springframework.org/schema/p"
   xmlns:context="http://www.springframework.org/schema/context"
   xsi:schemaLocation="http://www.springframework.org/schema/beans 
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
   http://www.springframework.org/schema/mvc
   http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
   http://www.springframework.org/schema/context 
   http://www.springframework.org/schema/context/spring-context.xsd">


<!-- Spring MVC Support for annotations (JSR-303) -->
<mvc:annotation-driven/>

<!-- Spring View resolver => find the jsps -->
<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver"
      p:suffix=".jsp" />

<!--  Spring info : what packages to scan for detecting annotations -->
<context:component-scan base-package="myPackages"/>

だから私はあなたの助けが必要です.Spring ServiceをHTTPSessionListenerに挿入する方法を知っている人はいますか?

よろしくお願いします。

4

1 に答える 1

3

オプションの 1 つ (おそらく設計の観点からは最良のオプション) は、スコープ Bean を作成しsession( を宣言することを忘れないでくださいRequestContextListener)、セッションのライフサイクルに関連付けられたロジックをその中に入れることです。Spring は、セッションが破棄されるときに、その破棄メソッド ( で注釈が付けられている@PreDestroyか、 として構成されている)を自動的に呼び出します。destroy-method

セッション リスナーへのインジェクションを使用するアプローチは、 に関連付けられたアプリケーション コンテキストを しか持ってDispatcherServletおらずContextLoaderListener、取得できないため、問題を引き起こします。そのアプローチに従うことを選択した場合は、ルート アプリケーション コンテキストを作成し、それにいくつかの Bean を抽出する必要があります。WebApplicationContextUtilsDispatcherServletWebApplicationContextUtils

于 2012-07-30T11:41:27.187 に答える