【问题标题】:spring @PostConstruct not firing in JBoss7spring @PostConstruct 没有在 JBoss7 中触发
【发布时间】:2014-02-28 19:32:28
【问题描述】:

在将运行在 WebSphere 和 Netweaver 中的应用程序更新为在 JBoss6.2 EAP 中运行后,我遇到了问题。

我发现带有带有 @PostConstruct (javax.annotation.PostConstruct) 注释的 init() 方法的 spring 管理的 @Repository (org.springframework.stereotype.Repository) 没有运行 init() 方法部署在 JBossEAP 6.2.0 中。

该类如下所示:

        package com.company.productname.api.dao.impl;


        // ... imports removed ....

        @Repository
        public class UserRoleDao extends AbstractBaseDao {

            private static final Log LOG = LogFactory.getLog(UserRoleDao.class);

            private boolean testInitInvoked = false;


            // .... some code removed .... 

            /**
             * Prepare the caches used to lookup market roles
             */
            @PostConstruct
            protected void init() {
             testInitInvoked = true;
            if (LOG.isDebugEnabled())LOG.debug("UserRoleDao.init() method called");

                      // .. . . . some code removed ......
              }


            @Override
            public Mask getMask(final String aMaskName) {
                LOG.debug("getRoleMask entered, testInitInvoked = [" + testInitInvoked + "]- aMaskName = " + aMaskName);

                Mask myMask = masksByName.map().get(aMaskName);

                if (myMask != null) {
                    myMask.setMembers(this.getMembersForMaskId(myMask.getId()));
                }

                LOG.debug("getRoleMask returning - myMask = " + myMask);

                return myMask;
            }
        }

从日志中我可以看到,init 方法中的日志没有被记录,并且当应用程序使用该类时,testInitInvoked 布尔值的值保持为 false(启动后很长一段时间) .

上面的类在一个 jar 中,捆绑到 war/WEB-INF/lib 中。

我可以从 spring 日志中看到,UserRoleDao 类正在自动装配到使用 @Autowired 注释引用它的类中。

spring jar 安装在 JBoss 的 JBOSS_HOME\modules\com\company\thirdparty\main 中,并被 module.xml 文件正确引用(因为大多数应用程序是 spring 管理的,我知道它们被正确引用)。

spring 上下文使用类扫描,如下面的 spring 上下文 xml 文件摘录所示:

<context:component-scan base-package="com.company.productname.api" />

所以,奇怪的是 spring 能够将 UserRoleDao 类自动装配到使用它的 Service 类中,但 @PostConstruct 似乎被忽略了。

我尝试将 spring jar 移动到 WEB-INF\lib 目录中(我发现在 Hibernate 之前的问题中,如果 JBOSS_HOME\modules 中引用了 jar 并将它们移动到 WEB-INF 中,则注释不会被扫描\lib 目录已修复)。

以前有没有其他人注意到类似的问题? (并找到了解决方案!)

@PostConstruct init 方法在使用相同的 Spring 版本 jar 部署在 WebSphere 和 Netweaver 中时会被触发。

抱歉,如果我在错误的地方发布了这个,请告诉我,我会移动它。

谢谢,

版本:

JBoss:EAP 6.2.0.GA(基于 AS 7.3.0)

春季:3.1.1

【问题讨论】:

  • 你能把你的 WEB-INF/lib 里的 jar 贴出来吗?确保其中没有包含 @PostConstruct 注释的 API jar。 JBoss 对类和类加载可能非常挑剔。
  • 您好 M. Deinum,很抱歉延迟回复,我没有收到有人回复的通知。我发现如果我将 spring jar 放在我的 WEB-INF/lib 目录中,并将它们从模块中删除,那么 @PostConstruct 注释就会起作用。

标签: java spring jboss7.x


【解决方案1】:

添加依赖

&lt;module name="javax.annotation.api" export="true"/&gt;

spring 模块对我有用。

【讨论】:

  • 为我工作(JBoss 6.4 和 Spring Boot 1.2.7.RELEASE)。我遇到了同样的问题。
【解决方案2】:

感谢 M. Deinum 的建议,我得以解决此问题。我必须将 spring jar 放在我的 WEB-INF/lib 目录中,然后从 modules 目录中删除它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 2017-06-04
    相关资源
    最近更新 更多