gpt4 book ai didi

ejb - CDI WELD @ConversationScoped @Stateful EJB talk.end() & @Remove SFSB

转载 作者:行者123 更新时间:2023-12-01 04:11:29 28 4
gpt4 key购买 nike

目前我正在尝试删除 ConversationScoped 有状态 session Bean (SFSB)。 ConversationScope 由 CDI Container 管理,SFSB 的生命周期由 EJB Container 管理。这样对吗?

在我的 Controller 中,我试图通过调用 SFSB 的方法并调用 @Remove 注释方法来销毁 SFSB 来结束对话。

对话可以毫无问题地结束,但我无法破坏 SFSB。

焊接引用指南 (WELD Conversation Scope) 中的代码示例:

@ConversationScoped @Stateful
public class OrderBuilder {

private Order order;
private @Inject Conversation conversation;
private @PersistenceContext(type = EXTENDED) EntityManager em;

@Produces public Order getOrder() {
return order;
}


public Order createOrder() {
order = new Order();
conversation.begin();
return order;
}

public void addLineItem(Product product, int quantity) {
order.add(new LineItem(product, quantity));
}


public void saveOrder(Order order) {
em.persist(order);
conversation.end();
}

@Remove
public void destroy() {}

}

Controller :
@Named
@SessionScoped
public class TestController implements Serializable{

@Inject
private OrderBuilder orderBuilder;

...

public String checkout(Order order){
orderBuilder.saveOrder(order);
orderBuilder.destroy();
return "success";
}
}

在我调用 testController.checkout(order) 之后,我收到了这个异常:

javax.servlet.ServletException: java.lang.reflect.InvocationTargetException javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67) root cause

javax.faces.el.EvaluationException:

java.lang.reflect.InvocationTargetException javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) javax.faces.component.UICommand.broadcast(UICommand.java:311) javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)



有任何想法吗?

谢谢

最佳答案

您应该结束 CDI 对话,CDI 将调用 @Remove 方法。

看看焊接文档:

有状态 session bean 可以定义一个删除方法,注释为 @Remove,应用程序使用它来指示应该销毁一个实例。但是,对于 bean 的上下文实例(CDI 控制下的实例),如果 bean 具有 @Dependent 作用域,则此方法只能由应用程序调用。对于具有其他作用域的 bean,应用程序必须让容器销毁 bean。

关于ejb - CDI WELD @ConversationScoped @Stateful EJB talk.end() & @Remove SFSB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5950609/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com