我创建了一个演示错误的小示例。
有状态 bean 持有一个列表作为其状态并注入一个无状态 bean:
@Stateful
@RequestScoped
public class StatefulBean {
@Inject
StatelessBean slsb;
@Getter // public list getter
private List<String> list = new ArrayList<>();
public List<String> sfAdd() {
slsb.slAdd();
System.out.println(list);
list.add("Z");
return list;
}
}
无状态 bean 通过注入来操作有状态 bean 的状态:
@Stateless
public class StatelessBean {
@Inject
StatefulBean sfsb;
public void slAdd() {
sfsb.getList().add("S");
}
}
调用System.out.println(sfsb.sfAdd());
是在 JAXRS GET 方法中进行的。我期望的调用步骤是:
sfAdd
叫做slAdd
被调用并添加"S"
,返回。- 打印
[S]
。 - 添加
"Z"
,返回。 - 打印
[S, Z]
。
通常会发生什么,但输出也会给出错误消息:
INFO [stdout] (default task-2) [S]
ERROR [org.jboss.as.ejb3] (default task-2) WFLYEJB0487: Unexpected invocation state 0
INFO [stdout] (default task-2) [S, Z]
我不明白什么是WFLYEJB0487: Unexpected invocation state 0
,为什么会发生以及我应该怎么做。该消息在第 3 步和第 5 步之间打印。Google 仅找到https://developer.jboss.org/thread/272767但这没有帮助。
我还发现删除@Stateful
fromStatefulBean
会导致错误消失。Wildfly 10.1,JavaEE 7。