Spring / Struts2に問題があり、Springフォーラムで質問しましたが、応答がありません @Resourceが挿入されないことがあります
読みやすくするために、ここで質問を繰り返します。うまくいけば、スパムとは見なされません
@Resourceを使用してBeanを注入すると、非常に奇妙な問題が発生します。Spring3.0.0で提供されているSpringプラグインでStruts22.2.3.1を使用しています。(すべてのプログラムが本番環境にあるため、適切な原因を知らずに最新バージョンのSpringにアップグレードすることはできません)
問題または観察された問題は、Struts2アクションが作成されたときに、@Resourceで注釈が付けられたフィールドにSpringによって注入されたリソースがあると想定されることです。ただし、注釈付きリソースの1つが挿入されない場合や、値が単にnullであるために、NullPointerExceptionが発生する場合があります。問題が発生するポイントは特定されていません。つまり、異なる環境で実行されている同じプログラムセットは、異なる動作を引き起こします。また、注入されないリソースは常に同じであるとは限りません。たとえば、アクションA、B、C、および環境E1とE2がある場合、E1ではAアクションでこの問題が発生することがあり、E2ではアクションBで問題が発生する可能性があります。その1つ
これが、問題が「時々」のみ発生するという意味です。Aがこの種の問題を抱えていて、Webサーバー(tomcatまたはWAS)を起動し、初めてAにアクセスすると、問題が発生した場合、このサーバーの起動中ずっと発生します。初めてAにアクセスしたときに問題が発生しない場合は、このサーバーの起動中は問題は発生しません。また、今回が注入されていない最初のリソースである場合は、この起動でも同じになります。
これが私のアプリケーション設定のビットです:私は注釈スキャンと混合されたXMLを使用しています。基本的に、すべてのAction、Service、DaoクラスはXMLで定義されていますが、Springが実際のクラスをスキャンするために、すべてのプロパティ定義は省略されています。
サンプル定義:
コード:
<!-- have this in all XML files -->
<context:annotation-config/>
<!-- an action definition, all actions are scoped prototype. It will use adm.common.admBranchesManager in the action with field annotated with @Resource -->
<bean id="adm.common.chooseBranchAction" class="com.bi.wms.adm.common.web.ChooseBranchAction" scope="prototype"></bean>
<!-- all service and dao are singleton and do not have any problem, all service/Manager are annotated with @Transactional. In Action we only code against interface and not actual concrete class -->
<bean id="adm.common.admBranchesManager" class="com.bi.wms.adm.common.service.impl.AdmBranchesManagerImpl"/>
<bean id="adm.common.admBranchesDao" class="com.bi.wms.adm.common.dao.jdbc.AdmBranchesDaoImpl"/>
また、すべてのアクションについて、セッションスコープのリソースフィールドを持つ抽象アクションを拡張します。
コード:
<bean id="base.wms.login" class="com.bi.wms.common.model.WmsLogin" destroy-method="logout" scope="session">
<aop:scoped-proxy />
<property name="admUserSessionsManager" ref="adm.operation.admUserSessionsManager"/>
</bean>
サンプルアクションの一部を次に示します。コード:
//this class is just a sample not the actually one thats having the problem, AbstractWmsAction is the class that have a session-scoped bean
public class AdmWmsControlAction extends AbstractWmsAction
{
@Resource(name = "adm.operation.admWmsBatchGroupsManager")
private AdmWmsBatchGroupsManager admWmsBatchGroupsManager;
@Resource(name = "adm.operation.admWmsControlManager")
private AdmWmsControlManager admWmsControlManager;
//sometimes we use setters for injecting but that doesnt stop the problem from happening
//....omit
}
誰かがこの種の問題を抱えていたかどうかはわかりません。追加情報が必要な場合は、最善を尽くして提供します。
ありがとう