2

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
}

誰かがこの種の問題を抱えていたかどうかはわかりません。追加情報が必要な場合は、最善を尽くして提供します。

ありがとう

4

2 に答える 2

0

注釈を使用する Spring で以前に同様の問題を見たことがあります。これが、限られた状況で @Transactional を使用することを好む理由です。@Transactional アノテーションが付けられているクラスはどれですか? 実装またはインターフェース?

私はこれをデバッガーで簡単に調べただけですが、@Transactional で作成された 1 つの Spring プロキシと、アプリケーション コンテキストで定義されたもう 1 つの Bean で終わる可能性があると思います。Spring 構成ファイルでサービスを定義している場合は、そこでトランザクション プロキシも定義し、@Resource アノテーションを使用して名前でプロキシを注入するか、xml で構成を削除し、型で注入することをお勧めします。あなたの注釈。このようにして、解決できないタイプの重複一致がある場合、Spring から通知されます。

于 2013-03-18T15:56:47.440 に答える