相关疑难解决方法(0)

使用Jersey 2.0,如何为每个请求注册一个可绑定实例?

...如果实例需要手动构建,可能是第三方工厂类?以前,(泽西岛1.x),你会做这样的事情:

public class MyInjectableProvider extends PerRequestTypeInjectableProvider<Context, MyInjectable> {
    public MyInjectableProvider() {
        super(MyInjectable.class);
    }

    @Override
    public Injectable<MyInjectable> getInjectable(ComponentContext ic, Context context) {
        MyInjectable myInjectableInstance = //...

        return new Injectable<MyInjectable>() {
            @Override
            public MyInjectable getValue() {
                return myInjectableInstance;
            }
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

匿名本地类能够访问要在某个范围内返回的实例.当您不使用具有默认构造函数的类时,这非常有用,但它们需要基于每个请求构建.

Jersey 2.0切换到HK2作为依赖注入框架,但是,迁移页面(https://jersey.java.net/documentation/latest/migration.html)没有提供这种绑定的示例,并且HK2文档没有提供使用AbstractBinder的示例.

为了进一步阐述,我正在尝试向我的资源提供资源本地的,与容器无关的JPA EntityManager实例.这些必须从单件工厂类中获取,并且应该只针对单个"工作单元",这在我的情况下是一个请求.我知道有解决方法(只是注入工厂,或绑定到threadlocal),但我发现以前的解决方案很优雅,并希望尽可能重新创建它.

编辑:
经过一段时间的HK2 javadocs挖掘后,我发现类似的东西可以实现如下:

public class MyInjectableProvider extends AbstractBinder 
        implements Factory<MyInjectable> {
    @Override
    protected void configure() {
        bindFactory(this).to(MyInjectable.class);
    }

    @Override
    public MyInjectable provide() {
        return getMyInjectable();
    }

    @Override
    public void dispose(MyInjectable instance) {}
} …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection jersey jersey-2.0

22
推荐指数
1
解决办法
7871
查看次数

Jersey + HK2 + Grizzly:注入EntityManager的正确方法是什么?

我已经设法在Jersey,HK2和一个简单的GrizzlyServer中设置我自己的服务类的注入(进入资源类).(基本上遵循这个例子.)

我现在好奇将JPA EntityManagers注入我的资源类最好的是什么?(我目前正在考虑将一个请求作为一个工作单元).我目前正在探索的一个选项是以Factory<EntityManager>下列方式使用a :

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

}
Run Code Online (Sandbox Code Playgroud)

并按如下方式绑定它:

bindFactory(new MyEntityManagerFactory())
        .to(EntityManager.class)
        .in(RequestScoped.class);
Run Code Online (Sandbox Code Playgroud)

问题是dispose从不调用-method.

我的问题:

  1. 这是在Jersey + HK2中注入EntityManagers的正确方法吗?
  2. 如果是这样,我该如何确保我的EntityManagers正确关闭?

(我宁愿不依赖于重量级容器或额外的依赖注入库来覆盖这个用例.)

dependency-injection jpa jersey grizzly hk2

7
推荐指数
1
解决办法
3101
查看次数

如何在jersey/hk2应用程序中正确配置EntityManager?

我有一个使用JPA持久性的jersey-2/hk2应用程序.将EntityManager在这样的约束启动

public MyApplication() {
    // ...
    register(new AbstractBinder() {
        @Override
        public void configure() {
          bindFactory(EmFactory.class)
            .to(EntityManager.class)
            .in(RequestScoped.class);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

与工厂类一样

public class EmFactory implements Factory<EntityManager> {

    private static final String PERSISTENCE_UNIT = "unit";

    private EntityManagerFactory emf;
    private CloseableService closeableService;

    @Inject
    public EmFactory(@Named(PERSISTENCE_UNIT) String persistenceUnit,
            CloseableService closeableService) {
        emf = Persistence.createEntityManagerFactory(persistenceUnit);
        this.closeableService = closeableService;
    }

    @Override
    public EntityManager provide() {
        final EntityManager entityManager = emf.createEntityManager();
        closeableService.add(new Closeable() {

            @Override
            public void close() throws IOException {
                if(entityManager.isOpen()) {
                    entityManager.close(); …
Run Code Online (Sandbox Code Playgroud)

java dependency-injection jpa jersey-2.0 hk2

7
推荐指数
1
解决办法
7376
查看次数

标签 统计

dependency-injection ×3

hk2 ×2

java ×2

jersey ×2

jersey-2.0 ×2

jpa ×2

grizzly ×1