【发布时间】: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 注释就会起作用。