CDI WELD @ConversationScoped @Stateful EJB conversion.end () & @Remove SFSB

Actualmente estoy tratando de eliminar un Bean de sesión con estado de ConversationScoped (SFSB). El ConversationScope es administrado por el contenedor CDI y el ciclo de vida del SFSB es administrado por el contenedor EJB. ¿Es esto correcto?

En mi controlador, estoy tratando de terminar la conversación llamando a un método del SFSB y al método anotado @Remove para destruir el SFSB.

La conversación puede finalizar sin problemas, pero no puedo destruir el SFSB.

Un ejemplo de código de la Guía de referencia de soldadura (Alcance de la conversación 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() {}

}

El controlador:

@Named
@SessionScoped
public class TestController implements Serializable{

  @Inject
  private OrderBuilder orderBuilder;

  ...

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

Después de haber llamado testController.checkout (orden), obtengo esta excepción:

javax.servlet.ServletException: java.lang.reflect.InvocationTargetException javax.faces.webapp.FacesServlet.service (FacesServlet.java:321) org.jboss.weld.servlet.ConversationPropagationFilter.doFilter (causa raíz de la conversación:

javax.faces.el.EvaluationException:

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

¿Alguna idea?

THX

preguntado el 10 de mayo de 11 a las 13:05

2 Respuestas

Debe finalizar la conversación CDI y CDI llamará al método @Remove.

Eche un vistazo a la documentación de Weld: "Los beans de sesión con estado pueden definir un método de eliminación, anotado @Remove, que es utilizado por la aplicación para indicar que una instancia debe ser destruida. Sin embargo, para una instancia contextual del bean, una instancia bajo el control de CDI: la aplicación solo puede llamar a este método si el bean tiene un alcance @Dependent. Para beans con otros alcances, la aplicación debe permitir que el contenedor destruya el bean ".

Respondido el 14 de junio de 12 a las 17:06

JSF 1.2 o 2.0 no admite expresiones como métodos con parámetro obj.method (parámetro) JSF solo supoorts método sin parámetro como obj.method () Seam 2,3 build in admite este tipo de expreesions pero si está utilizando solo soldadura (CDI soporte de costura, núcleo de costura) sin otros frascos de costura, no puede tener esta capacidad. Pero es posible otorgar este tipo de capacidad a JSF. Agregando esto al proyecto jar, puede usar métodos con parámetros. Si está utilizando maven u puede utilizar el código a continuación o. Descargue los frascos manualmente en la carpeta 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>

Además, lo probé con tomcat funcionó bien, pero en el embarcadero ocurren algunos conflictos con los otros frascos. Puede que se trate de mi proyecto.

Agregar esto a web xml

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

Respondido 24 Oct 11, 09:10

No sé cuál sino uno de los frascos en la costura 3 da esta habilidad. Puede agregar esto sin estos frascos. - Mustafa SAHIN AYDIN

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.