Pregunta

@Path(value = "/user")
@Stateless
public class UserService {

    @Inject
    private UserManager manager;

    @Path(value = "/create")
    @GET
    @Produces(value = MediaType.TEXT_PLAIN)
    public String doCreate(@QueryParam(value = "name") String name) {
        manager.createUser(name);

        return "OK";
    }
}

aquí es el gestor de usuarios impl

public class UserManager {

    @PersistenceContext(unitName = "shop")
    private EntityManager em;

    public void createUser(String name) {
        User user = new User();
        user.setName(name);
        // skip some more initializations 
        em.persist(user);
    }
}

el problema es que si No marco UserService como @Stateless entonces el campo es nulo gerente

pero si me marca @Stateless, puedo tener el campo gestor de inyectar, y trabaja la aplicación como puedo conseguir los datos guardados en db

pregunto, ¿cuál es la razón detrás de esto?

y esta es la forma preferida para el cableado de la aplicación?

Bien, estoy pensando a sacar el EntityManager a un productor, de modo que pueda ser compartida

¿Fue útil?

Solución

el problema es que si No marco UserService como @Stateless entonces el campo es nulo gerente

Para la inyección se produzca, la clase tiene que ser un componente administrado como Beans Enterprise, servlets, Filtros, frijoles JSF administrados, etc o CDI bean administrado (esto es la parte nueva con Java EE 6, se puede hacer cualquier clase de un bean gestionado con CDI).

Por lo tanto, si usted no hace sus JAX-RS de punto final un EJB, cómo habilitar la inyección? Esto se explica muy bien en JAX-RS y la integración CDI usando GlassFish v3 :

Hay dos maneras de frijoles CDI logrado están habilitados:

  1. instancia por el CDI, el ciclo de vida gestionado por Jersey. Anotar con @ManagedBean y opcionalmente annotate con una anotación alcance Jersey.

  2. instanciado y gestionado por CDI. Anotar con una anotación alcance CDI, como @RequestScoped (sin @ManagedBean se requiere)

Yo también sugieren la comprobación de los recursos a continuación.

y esta es la forma preferida para el cableado de la aplicación?

Yo diría que sí. CDI es muy agradable y ... ¿No te gusta la inyección?

Bien, estoy pensando a sacar el EntityManager a un productor, de modo que pueda ser compartida

compartida entre qué? ¿Y por qué? En caso de que usted, usted debe utilizar un EntityManager con una vida útil que se ámbito para una sola transacción (a transacción con ámbito de contexto de persistencia ). En otras palabras, no lo comparta (y no se preocupe de apertura y cierre para cada solicitud, ésta no es una operación costosa).

Referencias

  • JPA 2.0 Especificación
      "La persistencia de contenedores gestionados Contextos"
    • Sección 7.6
    • Sección 7.6.1 "gestionada por contenedor con ámbito de transacción Persistencia Contexto"
    • Sección 7.6.2 "Contenedor gestionados contexto de persistencia extendido"

Recursos

Otros consejos

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top