[Seasar-user:22170] Re: インジェクションしたインスタンスが参照できなくなる事象について
Toshihiro Nakamura
[E-MAIL ADDRESS DELETED]
2021年 11月 9日 (火) 09:22:15 JST
中村です。
OGNLのバージョンは何を使っていますか?
随分昔ですが似たような問題に遭遇したことがあります。
https://www.seasar.org/issues/browse/CONTAINER-45
もしognl-2.6.9以下を使っているならば
リンク先のコメントに書いてあるognl-2.6.9-patch-20070624.jarを使ってみてください。
Seasar2の配布ファイルに同梱されていると思います。
なお、どのバージョンか忘れましたがOGNL本体にも修正を取り込んでもらっています。
そちらのバージョンを使うでもよいかもしれません。
From: Seasar-user <seasar-user-bounces @ ml.seasar.org> On Behalf Of Isao SASAKI
Sent: Monday, November 8, 2021 5:16 PM
To: seasar-user @ ml.seasar.org
Subject: [Seasar-user:22169] インジェクションしたインスタンスが参照できなくなる事象について
佐々木ともうします
以下事象について経験がある方がいましたらなにかアドバイスを頂ければと思います。
レスポンス頂けるかわかりませんが一読いただければと思います。
よろしくお願いいたします。
【事象】
セッター・インジェクションで取得したインスタンスがnullになってしまいます。
必ずnullになる訳ではなく、システム起動からずっと取得出来ていたものが突然nullしか取得できなくなり事があります。
一度nullになると、以降はアプリケーションサーバー(Tomcat)の再起動するまでnullになってしまいます。
何がトリガーとなってnullになってしまうのかが分からない状態です。
インジェクションが外れてしまうのはDao(S2Dao)のインスタンスです。
コード、diconの内容を抜粋添付します。
【ご教授頂きたい内容】
インジェクションでnullが発生しないようにする方法
または
nullになった場合に再度インジェクションするための対応方法
Seasarバージョン 2.3.23
S2Daoバージョン 1.0.51
javaバージョン jdk1.7.0_79
Tomcatバージョン Apache Tomcat/7.0.75
稼働OS CentOS7
※インジェクションがNULLになってしまうsetTmUserDaoでのtmUserDaoというインスタンス
・実装の抜粋
javaファイル(tmUserDaoをインジェクションしている)
1: public void setTmUserDao(TmUserDao tmUserDao) {
2: this.tmUserDao = tmUserDao;
3: }
4:
5: @Aspect("j2ee.requiredTx")
6: public BcmLoginServiceDto doLogin(String userId, String password,
7: String ipAddress, Long storecd) {
8:
9: BcmLoginServiceDto bcmLoginServiceDto = new BcmLoginServiceDto();
10: List<TmUserEntity> list = null;
11: //障害のためのログ入れ start
12: if (this.tmUserDao!=null) {
13: System.out.println("BcmLoginService doLogin : TmUserDao is not null");
14: } else {
15: System.out.println("BcmLoginService doLogin : TmUserDao is null");
16: }
17: //障害のためのログ入れ end
18: if(storecd != null && Constants.MORU_STORE_CD == storecd) {
19: list = this.tmUserDao.selectByUserIdPasswordPermission(userId,password);
10: } else {
21: list = this.tmUserDao.selectByUserIdPassword(userId,password);
22: }
※11~17行目は確認のためのログ
※19,21行目で、NullPointerExceptionが発生
※NullPointerException発生時には15行目のログが出力されている(TmUserDaoがnullになっている)
diconファイル
<component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="instanceDef">
@org.seasar.framework.container.deployer.InstanceDefFactory @ SINGLETON
</property>
<property name="autoNaming">
<component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"jp.co.itfor.itforec"</arg>
<arg>".*ServiceImpl,.*Dao,.*DAO,.*DxoImpl"</arg>
</initMethod>
<initMethod name="addIgnoreClassPattern">
<arg>"jp.co.itfor.itforec.service.settlement.gmo"</arg><arg>"GmoServiceImpl"</arg>
</initMethod>
<initMethod name="addIgnoreClassPattern">
<arg>"jp.co.itfor.itforec.service.settlement.wellnet"</arg><arg>"WellnetServiceImpl"</arg>
</initMethod>
</component>
<component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister">
<property name="instanceDef">
@org.seasar.framework.container.deployer.InstanceDefFactory @ PROTOTYPE
</property>
<property name="autoNaming">
<component class="org.seasar.framework.container.autoregister.DefaultAutoNaming"/>
</property>
<initMethod name="addClassPattern">
<arg>"jp.co.itfor.itforec"</arg>
<arg>".*LogicImpl"</arg>
</initMethod>
</component>
<!-- アスペクトの自動登録 -->
<!-- Dao -->
<component class="org.seasar.framework.container.autoregister.AspectAutoRegister">
<property name="interceptor">
dao.interceptor
</property>
<initMethod name="addClassPattern">
<arg>"jp.co.itfor.itforec.dao"</arg>
<arg>".*Dao,.*DAO"</arg>
</initMethod>
</component>
-------------- next part --------------
HTML$B$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20211109/a0a26c17/attachment.htm>
Seasar-user メーリングリストの案内