jpa dependency-injection jersey grizzly hk2

jpa - Jersey+HK2+Grizzly: ¿forma correcta de inyectar EntityManager?



dependency-injection (1)

Logré configurar la inyección (en clases de recursos) de mis propias clases de servicio en Jersey, HK2 y un simple GrizzlyServer. (Básicamente siguió este ejemplo )

Ahora tengo curiosidad por saber qué es lo mejor para inyectar JPA EntityManagers en mis clases de recursos. (Actualmente estoy considerando una solicitud como una unidad de trabajo). Una opción que estoy explorando actualmente es usar Factory<EntityManager> de la siguiente manera:

class MyEntityManagerFactory implements Factory<EntityManager> { EntityManagerFactory emf; public MyEntityManagerFactory() { emf = Persistence.createEntityManagerFactory("manager1"); } @Override public void dispose(EntityManager em) { em.close(); } @Override public EntityManager provide() { return emf.createEntityManager(); } }

y agréguelo de la siguiente manera:

bindFactory(new MyEntityManagerFactory()) .to(EntityManager.class) .in(RequestScoped.class);

El problema es que el método dispose nunca se invoca.

Mis preguntas:

  1. ¿Es este el enfoque correcto para inyectar EntityManagers en Jersey + HK2?
  2. Si es así, ¿cómo debo asegurarme de que mis EntityManagers estén cerrados correctamente?

(Prefiero no depender de contenedores pesados ​​o una biblioteca de inyección de dependencia adicional solo para cubrir este caso de uso).


En lugar de Factory<T>.dispose(T) , el registro con el inyectable CloseableService puede hacer la mayor parte de lo que desee. Se necesitará un adaptador de Closeable . CloseableService closes() todos los recursos registrados al salir del alcance de la solicitud.

class MyEntityManagerFactory implements Factory<EntityManager> { private final CloseableService closeableService; EntityManagerFactory emf; @Inject public MyEntityManagerFactory(CloseableService closeableService) { this.closeableService = checkNotNull(closeableService); emf = Persistence.createEntityManagerFactory("manager1"); } @Override public void dispose(EntityManager em) { em.close(); } @Override public EntityManager provide() { final EntityManager em = emf.createEntityManager(); closeableService.add(new Closeable() { public final void close() { em.close(); } }); return em; } }