4

現在、ConversationScopedステートフルセッションBean(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

4

2 に答える 2

3

CDI会話を終了する必要があり、CDIは@Removeメソッドを呼び出します。

Weldのドキュメントをご覧ください:「ステートフルセッションBeanは、インスタンスを破棄する必要があることを示すためにアプリケーションで使用される、@ Removeという注釈の付いたremoveメソッドを定義できます。ただし、Beanのコンテキストインスタンスの場合、 CDIの制御-このメソッドは、Beanのスコープが@Dependentの場合にのみアプリケーションから呼び出すことができます。他のスコープのBeanの場合、アプリケーションはコンテナにBeanを破棄させる必要があります。」

于 2012-06-14T13:43:33.753 に答える
-1

JSF 1.2 または 2.0 は、パラメータ obj.method(parameter) を持つメソッドのような式をサポートしません 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 でテストしたところ正常に動作しましたが、jetty では他の jar と競合が発生しました。それは私のプロジェクトに関するものかもしれません。

これを Web xml に追加します

<context-param>
        <param-name>com.sun.faces.expressionFactory</param-name>
        <param-value>com.sun.el.ExpressionFactoryImpl</param-value>
</context-param>
于 2011-10-24T05:35:02.580 に答える