Jersey 2.26+:将 HK2 的工厂转换为供应商后未调用 configure()
Jersey 2.26+: configure() not called after converting HK2's Factory to Supplier
为了简化我们的 Web 服务,我想引入一个自定义 MyObj class 使用版本 2.34 中的 Jersey 框架,并希望通过@Context 注释。
我有两个问题:
假设一个网络服务方法@GET test(@Context MyObj obj),我如何控制什么时候 MyObj 的实例是根据现有 servlet 请求过滤器的执行创建的?
要创建 MyObj 的实例,我已经有一个基于 HK2 的 Factory 的工作示例(参见以下)。由于我观察到我的工厂 class 被实例化了两次,并且 Jersey 2.26+ 建议使用基于 Supplier 的更新方法,我试图转换我的例子。不幸的是,configure() 不会在提供的 Binder 实现 Supplier class 中被调用,因此,不会创建任何对象。我怎样才能让这个工作? (顺便说一句,在这两种情况下,Binder 和 BinderHK 都是通过 jersey.config.server.provider.classnames 在我的 web.xml.)
感谢您的帮助。
工作 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();
}
}
活页夹不是可以用 jersey.config..classnames
初始化参数注册的东西。您需要使用 或 Feature
注册它(并使用 init-param 注册功能)
@Provider
public class MyFeature implements Feature {
@Override
pubic boolean configure(FeatureContext ctx) {
ctx.register(new MyBinder());
return true;
}
}
为了简化我们的 Web 服务,我想引入一个自定义 MyObj class 使用版本 2.34 中的 Jersey 框架,并希望通过@Context 注释。
我有两个问题:
假设一个网络服务方法@GET test(@Context MyObj obj),我如何控制什么时候 MyObj 的实例是根据现有 servlet 请求过滤器的执行创建的?
要创建 MyObj 的实例,我已经有一个基于 HK2 的 Factory 的工作示例(参见以下)。由于我观察到我的工厂 class 被实例化了两次,并且 Jersey 2.26+ 建议使用基于 Supplier 的更新方法,我试图转换我的例子。不幸的是,configure() 不会在提供的 Binder 实现 Supplier class 中被调用,因此,不会创建任何对象。我怎样才能让这个工作? (顺便说一句,在这两种情况下,Binder 和 BinderHK 都是通过 jersey.config.server.provider.classnames 在我的 web.xml.)
感谢您的帮助。
工作 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();
}
}
活页夹不是可以用 jersey.config..classnames
初始化参数注册的东西。您需要使用 Feature
注册它(并使用 init-param 注册功能)
@Provider
public class MyFeature implements Feature {
@Override
pubic boolean configure(FeatureContext ctx) {
ctx.register(new MyBinder());
return true;
}
}