好的,我遇到了对我没有任何意义的 SEAM (2.1.1.GA) 问题。
我有一个组件,它是会话范围并用@AutoCreate 注释的。
该组件有一个用@Create 注释的创建方法。
问题是在创建方法完成之前,接缝正在同一个组件实例上调用另一个方法。因为创建方法还没有完成,所以第二种方法会抛出错误。
这是预期的行为吗?当然,对组件的其他调用应该阻塞,直到创建完成执行?!
有谁知道这件事……我有点不知所措。在这一点上,我只是想解决这个问题,但似乎这首先不应该是一个问题。
什么叫第二种方法?
如果它是另一个在启动时自动创建的 Bean,则将您的第一个 bean 作为依赖项放入。
@AutoCreate
@Startup(depends={"firstBean"})
@Name("secondBean")
public class SecondBean() {
...
}
老问题,但由于我今天偶然发现了这个问题,也许这对其他人有帮助。
这是 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);
}
}
所以事件的顺序是:
@Create
方法@Create
第 2 步意味着可以在方法完成之前从其他线程调用组件上的其他方法。
所以这就是问题所在。称其为 Seam 中的错误。就我而言,我可以通过使用构造函数而不是@Create
.