Я загружаю новый 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.