CDI WELD @ConversationScoped @Stateful EJB разговор.end () & @Remove SFSB - PullRequest
4 голосов
/ 10 мая 2011

В настоящее время я пытаюсь удалить объект сеанса ConversationScoped Stateful Session (SFSB). ConversationScope управляется контейнером CDI, а жизненный цикл SFSB - контейнером EJB. Это правильно?

В моем контроллере я пытаюсь завершить разговор, вызывая метод SFSB и вызывая аннотированный метод @Remove для уничтожения SFSB.

Разговор можно закончить без проблем, но я не могу уничтожить SFSB.

Пример кода из Справочного руководства по сварке ( Область обсуждения WELD ):

@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() {}

}

Контроллер:

@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) первопричина

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)

Есть идеи?

THX

Ответы [ 2 ]

3 голосов
/ 14 июня 2012

Вы должны завершить диалог CDI, и CDI вызовет метод @Remove.

Посмотрите документацию по сварке: " Сессионные компоненты с сохранением состояния могут определять метод удаления, аннотированный @Remove, который используется приложением, чтобы указать, что экземпляр должен быть уничтожен. Однако для контекстного экземпляра компонента - экземпляра под управлением CDI - этот метод может вызываться приложением только в том случае, если компонент имеет область действия @Dependent. Для bean-компонентов с другими областями применения приложение должно позволить контейнеру уничтожить bean-компонент. «

0 голосов
/ 24 октября 2011

JSF 1.2 или 2.0 не поддерживает выражения, подобные методам с параметром obj.method (параметр). JSF поддерживает только метод без параметров, таких как obj.method (). Сборка Seam 2,3 поддерживает такого рода выражения, но если вы используете толькоСварка (поддержка CDI шва, сердцевина шва) без других швов банок, у вас не может быть этой способности.Но такую ​​возможность можно дать JSF.Добавив это в проект jar, вы можете использовать методы с параметрами.Если вы используете Maven, вы можете использовать код ниже или.Загрузите jar-файлы вручную в папку lib.

     <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, который работал нормально, но в процессе некоторых конфликтов возникают другие jar-файлы.Может быть, речь идет о моем проекте.

Добавьте это в сеть xml

<context-param>
        <param-name>com.sun.faces.expressionFactory</param-name>
        <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
...