El uso de CDI + WS / RS + APP para construir una aplicación
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
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:
instancia por el CDI, el ciclo de vida gestionado por Jersey. Anotar con
@ManagedBean
y opcionalmente annotate con una anotación alcance Jersey.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
La @Singleton anotación ayudará a: http://www.mentby.com/paul-sandoz/jax-rs-on-glassfish-31-ejb-injection.html