2013-09-29 5 views
7

Мне удалось настроить инъекции (в классы ресурсов) моих собственных классов обслуживания в Джерси, HK2 и простой GrizzlyServer. (В основном следовали this example.)Jersey + HK2 + Grizzly: Правильный способ введения EntityManager?

Мне теперь интересно, что лучше всего ввести JPA EntityManagers в мои классы ресурсов? (В настоящее время я рассматриваю один запрос как одну единицу работы). Один из вариантов, что я в настоящее время изучает, чтобы использовать Factory<EntityManager> следующим образом:

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(); 
    } 

} 

и привязать его следующим образом:

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

Проблема заключается в том, что dispose -метод никогда не вызывается.

Мои вопросы:

  1. Является ли это правильный подход к инъекциям EntityManagers в Джерси + HK2?
  2. Если да, то как я должен убедиться, что мои EntityManagers закрыты правильно?

(я предпочел бы не зависеть от контейнеров и тяжелых или дополнительной библиотеки зависимостей инъекции, чтобы покрыть этот случай использования.)

+0

Аналогичный вопрос задают на http://stackoverflow.com/questions/17396165/using-jersey-2-0-how-do-you-register-a-bindable-instance-per-request. – ScootyPuff

+0

Да. Я поддержал и прокомментировал этот вопрос. – aioobe

+0

Я использую Jersey 2.10.1, и у меня нет этой проблемы. Расположить() вызывается как ожидалось. –

ответ

5

На месте Factory<T>.dispose(T), регистрируя с инъекционным CloseableService может сделать большинство что ты хочешь. Требуется адаптер Closeable. CloseableServicecloses() все зарегистрированные ресурсы после выхода из области запроса.

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; 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^