seam @create在调用组件的其他方法之前没有完成

时间:2009-10-01 16:49:03

标签: seam lifecycle

好的,我遇到了SEAM(2.1.1.GA)的问题,这对我没有任何意义。

我有一个会话作用域的组件,并使用@AutoCreate进行注释。

该组件具有使用@Create注释的创建方法。

问题在于,在创建方法完成之前,seam正在调用同一组件实例上的另一个方法。因为创建方法还没有完成,所以第二种方法就是抛出错误。

这是预期的行为吗?当然,在创建完成执行之前,对组件的其他调用应该会阻塞吗?!

有没有人知道这件事......我有点像我的智慧。在这一点上,我只是试图解决这个问题,但这似乎首先不应该是一个问题。

2 个答案:

答案 0 :(得分:3)

什么叫第二种方法?

如果是另一个也在启动时自动创建的Bean,那么将第一个bean作为依赖项。

@AutoCreate
@Startup(depends={"firstBean"})
@Name("secondBean")
public class SecondBean() {
...
}

答案 1 :(得分:2)

老问题,但是因为我今天偶然发现了这个问题,也许这对其他人有帮助。

这是Component.newInstance()的作用:

instance = instantiate();

if (getScope()!=STATELESS) {
   //put it in the context _before_ calling postconstuct or create
   getScope().getContext().set(name, instance); 
}

postConstruct(instance);

if (getScope()!=STATELESS) {
   callCreateMethod(instance);

   if (Events.exists()) {
       Events.instance().raiseEvent("org.jboss.seam.postCreate." + name, instance);
   }
}

所以事件的顺序是:

  1. 实例化您的组件
  2. 将您的组件放在会话范围
  3. 调用@Create方法
  4. 步骤2意味着在@Create方法完成之前,可以从其他线程调用组件上的其他方法。

    这就是问题所在。把它称为Seam中的一个错误。就我而言,我可以使用构造函数而不是@Create来解决它。