[Seasar-user:22171] Re: インジェクションしたインスタンスが参照できなくなる事象について

Yasuo Higa [E-MAIL ADDRESS DELETED]
2021年 11月 9日 (火) 10:55:57 JST


佐々木さん

Singletonのコンポーネントは、システムの起動時にしかセットされないので、
途中でnullになってしまうのは、誰かがnullを設定しているのだと思います。

Setterでnullが渡ってきたら、例外をthrowするようにすれば、
StackTraceを見て、誰がnullを設定しているのか、
ヒントがわかるかもしれません。

ひが

差出人: Seasar-user <seasar-user-bounces @ ml.seasar.org> が代理で送信: Isao SASAKI <sasaki.isao @ gmail.com>
日付: 月曜日, 2021年11月8日 17:16
宛先: seasar-user @ ml.seasar.org <seasar-user @ ml.seasar.org>
件名: [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の添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20211109/f8ad6f09/attachment.htm>


Seasar-user メーリングリストの案内