Простое использование (сварного) DI для проекта Джерси и Hibernate - PullRequest
0 голосов
/ 03 мая 2019

Я загружаю новый Java API-интерфейс restful, используя jersey и hibernate.

Я изо всех сил пытаюсь поставить DI во все это. В частности, мне кажется, что я не могу вводить hibernate (EntityManagerFactory или EntityManager), а также я бы хотел отсоединить остальной ресурс (ApiResource) от объекта DAO.

Вот упрощенная версия моего ресурса Джерси:

@Path("api")
public class ApiResource {

    private DBController db;

    public ApiResource() {
        this.db = DBController.getInstance("YOLO");
    }

    @GET
    @Produces({"application/json", MediaType.APPLICATION_JSON})
    @Path("/history/{id}")
    public void getTrends(@PathParam("id") String id) {
        List<Stuff> list = db.getById(id);
        return list;
    }

А затем соответствующий код DBController (который является просто DAO) выглядит примерно так:

public class DBController {

    private static DBController instance = null;
    private static EntityManagerFactory sessionFactory;
    private static EntityManager entityManager;

    public DBController(String persistenceUnitName) {
        sessionFactory = Persistence.createEntityManagerFactory(persistenceUnitName);
        entityManager = sessionFactory.createEntityManager();
    }

    public static DBController getInstance(String persistenceUnitName) {
        if (instance == null)
            instance = new DBController(persistenceUnitName);
        return instance;
    }

    public List<Stuff> getById(String id) {
        entityManager.getTransaction().begin();
        List<Stuff> list = entityManager.createQuery("select b from Yolo b where b.id =: ndg", Stuff.class)
                .setParameter("id", id)
                .getResultList();
        entityManager.getTransaction().commit();
        return list.stream().collect(Collectors.toList());
    }

А на моем главном я просто делаю:

  ResourceConfig resourceConfig = new ResourceConfig(ApiResource.class);
  final Channel server = NettyHttpContainerProvider.createHttp2Server(BASE_URI, resourceConfig, null);

  Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      @Override
      public void run() {
          server.close();
      }
  }));

  Thread.currentThread().join();    

Если у кого-нибудь есть пример проекта, использующего спящий режим и майку (а может и сварку?).

Примечание: я не использую Spring (и не хочу). Я могу использовать шов или Guice, если это необходимо. Не совсем уверен, для чего нужен hk2.

...