スプリング<br>事務管理の設定が無効です.分析と解決策
8775 ワード
設定は以下の通りです
この文章の内容はStudentServiceがspringにロードされていないからです.spring MVCではなく、sprigMVCにロードされています.srpingMVCをロードする時、事務に関する部分を処理していませんので、事務の設定は無効です.
発色があって、プロジェクトのスプリング、スプリングMVCの起動方式を重点的に見に行きます.
現在の設定:spring起動は事務管理を配置しています.自動スキャンは配置されていません.springMVCはグローバルの自動スキャンを配置しています.
トランザクションが無効な理由分析:spring起動時に事務管理情報を得ることができますが、スキャン配置がないため、注釈で登録されたStudentServiceが見えなくなり、StudentServiceの事務に関する処理ができなくなります.
スプリングMVCが起動したら、StudentServiceに登録できますが、事務管理に関する配置がないと、事務に関する処理はしません.
したがって、spring起動時にStudentServiceを見たら、事務関連の処理ができます.これはまた、明示的にbeanを配置すると効果的になる理由を説明しました.通常はserviceごとに明示的に配置しないので、spring配置スキャンで解決できます.
私の解決策:
スプリングMVC:
説明:テストを経て、springMVC Controllerの登録はspring起動時に行うことができません.登録されたController情報をspring MVCが取得した後に行われたさらなる処理は、来訪の要請を受けます.
私はより傾向があります.スプリングMVCは同じビーン容器を使っています.スプリングMVCは完全にスプリングに基づいて注入依存関係を処理しています.スプリングMVCだけが追加のことをしました.
両方の機能が違っていますので、配置ファイルについては、機能によって完全に分離する傾向があります.springMVCはController層の登録のスキャンだけを担当しています.springは他のすべてを担当しています.
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- AOP -->
<aop:config>
<aop:pointcut id="dbService" expression="execution(* com.qyd.sms.service.api.student.service.StudentService.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="dbService" />
</aop:config>
事務管理が無効であると同時に、非常に奇妙な現象があります.comp.qyd.sys.service.appi.student.service.StudentServiceという類を、<bean/>
という形で配置したら、事務管理が有効になります.この文章の内容はStudentServiceがspringにロードされていないからです.spring MVCではなく、sprigMVCにロードされています.srpingMVCをロードする時、事務に関する部分を処理していませんので、事務の設定は無効です.
発色があって、プロジェクトのスプリング、スプリングMVCの起動方式を重点的に見に行きます.
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/META-INF/spring/spring-beans.xml</param-value>
</context-param>
<servlet>
<servlet-name>qyd-sms-servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:/META-INF/spring/spring-web.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>qyd-sms-servlet</servlet-name>
<url-pattern>/*</url-pattern> </servlet-mapping>
springはContect LoaderListenerによって起動され、spring MVCはDisplatServletによって起動され、検証された結果、springはspring MVCより先に起動されました.現在の設定:spring起動は事務管理を配置しています.自動スキャンは配置されていません.springMVCはグローバルの自動スキャンを配置しています.
トランザクションが無効な理由分析:spring起動時に事務管理情報を得ることができますが、スキャン配置がないため、注釈で登録されたStudentServiceが見えなくなり、StudentServiceの事務に関する処理ができなくなります.
スプリングMVCが起動したら、StudentServiceに登録できますが、事務管理に関する配置がないと、事務に関する処理はしません.
したがって、spring起動時にStudentServiceを見たら、事務関連の処理ができます.これはまた、明示的にbeanを配置すると効果的になる理由を説明しました.通常はserviceごとに明示的に配置しないので、spring配置スキャンで解決できます.
私の解決策:
スプリングMVC:
<mvc:annotation-driven/>
<context:component-scan base-package="com.qyd.sms.controller" />
スプリング:<context:component-scan base-package="com.qyd.sms" >
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller"/>
</context:component-scan>
設定ファイルは上記の通りです.理由は以下に説明します.説明:テストを経て、springMVC Controllerの登録はspring起動時に行うことができません.登録されたController情報をspring MVCが取得した後に行われたさらなる処理は、来訪の要請を受けます.
私はより傾向があります.スプリングMVCは同じビーン容器を使っています.スプリングMVCは完全にスプリングに基づいて注入依存関係を処理しています.スプリングMVCだけが追加のことをしました.
両方の機能が違っていますので、配置ファイルについては、機能によって完全に分離する傾向があります.springMVCはController層の登録のスキャンだけを担当しています.springは他のすべてを担当しています.