首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CDI焊接@ConversationScoped @Stateful conversation.end() & @Remove

CDI焊接@ConversationScoped @Stateful conversation.end() & @Remove
EN

Stack Overflow用户
提问于 2011-05-10 13:14:56
回答 2查看 2.9K关注 0票数 4

目前,我正在尝试删除一个ConversationScoped状态会话Bean (SFSB)。ConversationScope由CDI容器管理,SFSB的生命周期由EJB管理。这是正确的吗?

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

谈话可以结束,没有任何问题,但我无法摧毁SFSB。

焊接参考指南(焊接会话范围)中的代码示例:

代码语言:javascript
复制
@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() {}

}

控制员:

代码语言:javascript
复制
@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(订单)之后,我得到了这个例外:

javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:67)的根源javax.servlet.ServletException: java.lang.reflect.InvocationTargetException javax.faces.el.EvaluationException: 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)

有什么想法吗?

THX

EN

回答 2

Stack Overflow用户

发布于 2012-06-14 13:43:33

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

查看Weld文档:“状态会话bean可以定义一个删除方法,即注释@ remove,该方法被应用程序用来指示应该销毁一个实例。但是,对于bean的上下文实例(CDI控制下的一个实例),该方法只能在bean具有作用域@依赖的情况下由应用程序调用。对于具有其他作用域的bean,应用程序必须让容器销毁bean。”

票数 3
EN

Stack Overflow用户

发布于 2011-10-24 05:35:02

JSF1.2或2.0不支持带有参数obj.method(参数)jars的表达式类方法,只支持obj.method() Seam 2、3等参数的方法,但如果只使用焊缝(CDI支持seam,core )而不使用其他seam jars,则不能具有这种能力。但是,将这种能力赋予JSF是可能的。将其添加到jar项目中,您可以使用带有参数的方法。如果您正在使用maven,您可以使用下面的代码或。在lib文件夹中手动下载jars。

代码语言:javascript
复制
     <dependency>
        <groupId>javax.el</groupId>
        <artifactId>el-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>el-impl</artifactId>
        <version>2.2</version>
    </dependency>

此外,我还用tomcat测试了它,但是在jetty中,其他罐子会发生一些冲突。可能是因为我的计划。

将其添加到web xml中

代码语言:javascript
复制
<context-param>
        <param-name>com.sun.faces.expressionFactory</param-name>
        <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5950609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档