Java 泽西岛2.26+;:转换HK2';后未调用configure();从工厂到供应商

Java 泽西岛2.26+;:转换HK2';后未调用configure();从工厂到供应商,java,jersey,migration,code-injection,Java,Jersey,Migration,Code Injection,为了简化我们的web服务,我想在版本2.34中引入一个使用Jersey框架的自定义MyObj类,并希望通过@Context注释注入创建的实例 我有两个问题: 假设使用web服务方法@GET test(@Context MyObj obj),我如何控制何时针对现有servlet请求过滤器的执行创建MyObj实例 为了创建MyObj的实例,我已经有了一个基于HK2工厂的工作示例(见下文)。因为我观察到我的工厂类被实例化了两次,Jersey 2.26+建议使用基于供应商的更新方法,所以我尝试转换我的

为了简化我们的web服务,我想在版本2.34中引入一个使用Jersey框架的自定义MyObj类,并希望通过@Context注释注入创建的实例

我有两个问题:

  • 假设使用web服务方法@GET test(@Context MyObj obj),我如何控制何时针对现有servlet请求过滤器的执行创建MyObj实例

  • 为了创建MyObj的实例,我已经有了一个基于HK2工厂的工作示例(见下文)。因为我观察到我的工厂类被实例化了两次,Jersey 2.26+建议使用基于供应商的更新方法,所以我尝试转换我的示例。不幸的是,在提供的绑定器实现供应商类中不会调用configure(),因此不会创建任何对象。我怎样才能让它工作?(顺便说一句,在这两种情况下,Binder和BinderHK都是通过myweb.xml中的jersey.config.server.provider.classnames注册的。)

  • 谢谢你的帮助

    工作HK2工厂示例:

    public class MyObjHK {}
    
    import org.glassfish.hk2.utilities.binding.AbstractBinder;
    import org.glassfish.jersey.process.internal.RequestScoped;
    public class BinderHK
    extends AbstractBinder {
        @Override protected void configure() {
            bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
        }
    }
    
    import org.glassfish.hk2.api.Factory;
    public class MyObjFactoryHK
    implements Factory<MyObjHK> {
        @Override public MyObjHK provide() {return new MyObjHK();} // ok
        @Override public void dispose(MyObjHK instance) {};
    }
    
    public class API_HK2 {
        @GET
        public static Response myobjhk(@Context MyObjHK obj) {
            System.out.println("called hk, obj="+obj); // ok
            return Response.ok().build();
        }
    }
    
    public class MyObj {}
    
    import org.glassfish.jersey.internal.inject.AbstractBinder;
    import org.glassfish.jersey.process.internal.RequestScoped;
    public class Binder
    extends AbstractBinder {
        @Override protected void configure() { // not called ???
            bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
        }
    }
    
    import java.util.function.Supplier;
    public class MyObjFactory
    implements Supplier<MyObj> { 
        @Override public MyObj get() {return new MyObj();}
    }
    
    public class API {
        @GET
        public static Response myobj(@Context MyObj obj) {
            System.out.println("called, obj="+obj); // null ???
            return Response.ok().build();
        }
    }
    
    公共类MyObjHK{}
    导入org.glassfish.hk2.utilities.binding.AbstractBinder;
    导入org.glassfish.jersey.process.internal.RequestScoped;
    公共类活页夹
    扩展抽象活页夹{
    @覆盖受保护的void configure(){
    bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
    }
    }
    进口org.glassfish.hk2.api.Factory;
    公共级MyObjFactoryHK
    机具厂{
    @重写公共MyObjHK provide(){返回新的MyObjHK();}//确定
    @重写公共void dispose(MyObjHK实例){};
    }
    公开课API_HK2{
    @得到
    公共静态响应myobjhk(@Context myobjhk obj){
    System.out.println(“称为hk,obj=“+obj”);//确定
    返回Response.ok().build();
    }
    }
    
    不工作的供应商示例:

    public class MyObjHK {}
    
    import org.glassfish.hk2.utilities.binding.AbstractBinder;
    import org.glassfish.jersey.process.internal.RequestScoped;
    public class BinderHK
    extends AbstractBinder {
        @Override protected void configure() {
            bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
        }
    }
    
    import org.glassfish.hk2.api.Factory;
    public class MyObjFactoryHK
    implements Factory<MyObjHK> {
        @Override public MyObjHK provide() {return new MyObjHK();} // ok
        @Override public void dispose(MyObjHK instance) {};
    }
    
    public class API_HK2 {
        @GET
        public static Response myobjhk(@Context MyObjHK obj) {
            System.out.println("called hk, obj="+obj); // ok
            return Response.ok().build();
        }
    }
    
    public class MyObj {}
    
    import org.glassfish.jersey.internal.inject.AbstractBinder;
    import org.glassfish.jersey.process.internal.RequestScoped;
    public class Binder
    extends AbstractBinder {
        @Override protected void configure() { // not called ???
            bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
        }
    }
    
    import java.util.function.Supplier;
    public class MyObjFactory
    implements Supplier<MyObj> { 
        @Override public MyObj get() {return new MyObj();}
    }
    
    public class API {
        @GET
        public static Response myobj(@Context MyObj obj) {
            System.out.println("called, obj="+obj); // null ???
            return Response.ok().build();
        }
    }
    
    公共类MyObj{}
    导入org.glassfish.jersey.internal.inject.AbstractBinder;
    导入org.glassfish.jersey.process.internal.RequestScoped;
    公共类活页夹
    扩展抽象活页夹{
    @覆盖受保护的void configure(){//未调用???
    bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
    }
    }
    导入java.util.function.Supplier;
    公营工厂
    执行供应商{
    @重写公共MyObj get(){返回新的MyObj();}
    }
    公共类API{
    @得到
    公共静态响应myobj(@Context myobj obj){
    System.out.println(“调用,obj=“+obj”);//空???
    返回Response.ok().build();
    }
    }
    
    活页夹不能在
    jersey.config..classnames
    init参数中注册。您需要使用或
    功能注册该功能(并使用init参数注册该功能)


    谢谢,但是MyFeature/Binder方法也不适用于我(我尝试使用init param jersey.config.server.provider.classnames以及jersey.config.server.provider.packages和@provider注册)。另外,与您的说法相反,BinderHK Extendes AbstractBinder的注册(参见下面我的工作示例)即使不使用功能也可以工作。欢迎提供更多提示。在第24.1章中的示例中,AbstractBinder的实现是直接注册的。它与解释相符:“虽然各个注入绑定实现各不相同,并且取决于您的用例,但要在Jersey中启用自定义注入扩展,您必须在应用程序ResourceConfig中注册自定义HK2绑定实现!”。现在,我想知道web.xml是否还不够,但我真的必须明确地使用ResourceConfig实例(我还没有测试它)?该文档已经多年没有更新了。特别是香港2号。正如您所见,它仍然使用HK2,尽管这不再是推荐的用法。除非您特别需要HK2功能,否则所有注入导入都应该来自
    jersey.internal.inject
    包。无论是直接注册还是通过功能注册都无关紧要。我已经使用HK2和Jersey很多年了,我有点知道我在做什么。您可能需要检查配置,或者如果仍然需要帮助,请提供完整的示例。通过您所展示的(在init参数配置旁边),一切看起来都很好。好的,在设置一个完整的示例时,我显然发现了问题。我无意中用@Provider注释了AbstractBinder和要素类。在AbstractBinder类中删除注释并仅将其保留在Feature类中后(根据您的答案),问题就解决了。谢谢你的支持。我还有最后一个问题:我仍然需要保留org.glassfish.jersey.inject-jersey-hk2依赖项(在pom.xml的2.34版本中)以保持工作正常,这是正确的吗?