jersey 2.26+:将hk2的工厂转换为供应商后未调用configure()

e5njpo68  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(323)

为了简化我们的web服务,我想在2.34版本中引入一个使用jersey框架的自定义myobj类,并希望通过@context注解注入创建的示例。
我有两个问题:
假设有一个web服务方法@get test(@context myobj obj),我如何控制何时根据现有servlet请求过滤器的执行创建myobj示例?
为了创建myobj的示例,我已经有了一个基于hk2工厂的工作示例(见下文)。由于我观察到我的工厂类被示例化了两次,并且jersey 2.26+推荐使用基于供应商的新方法,所以我尝试转换我的示例。不幸的是,configure()不会在提供的binder implements supplier类中调用,因此不会创建任何对象。我怎样才能让它工作(顺便说一句,在这两种情况下,binder和binderhk都是通过myweb.xml中的jersey.config.server.provider.classnames注册的。)
谢谢你的帮助。
工作hk2工厂示例:

  1. public class MyObjHK {}
  2. import org.glassfish.hk2.utilities.binding.AbstractBinder;
  3. import org.glassfish.jersey.process.internal.RequestScoped;
  4. public class BinderHK
  5. extends AbstractBinder {
  6. @Override protected void configure() {
  7. bindFactory(MyObjFactoryHK.class).to(MyObjHK.class).in(RequestScoped.class);
  8. }
  9. }
  10. import org.glassfish.hk2.api.Factory;
  11. public class MyObjFactoryHK
  12. implements Factory<MyObjHK> {
  13. @Override public MyObjHK provide() {return new MyObjHK();} // ok
  14. @Override public void dispose(MyObjHK instance) {};
  15. }
  16. public class API_HK2 {
  17. @GET
  18. public static Response myobjhk(@Context MyObjHK obj) {
  19. System.out.println("called hk, obj="+obj); // ok
  20. return Response.ok().build();
  21. }
  22. }

不起作用的供应商示例:

  1. public class MyObj {}
  2. import org.glassfish.jersey.internal.inject.AbstractBinder;
  3. import org.glassfish.jersey.process.internal.RequestScoped;
  4. public class Binder
  5. extends AbstractBinder {
  6. @Override protected void configure() { // not called ???
  7. bindFactory(MyObjFactory.class).to(MyObj.class).in(RequestScoped.class);
  8. }
  9. }
  10. import java.util.function.Supplier;
  11. public class MyObjFactory
  12. implements Supplier<MyObj> {
  13. @Override public MyObj get() {return new MyObj();}
  14. }
  15. public class API {
  16. @GET
  17. public static Response myobj(@Context MyObj obj) {
  18. System.out.println("called, obj="+obj); // null ???
  19. return Response.ok().build();
  20. }
  21. }
z4iuyo4d

z4iuyo4d1#

活页夹不是可以注册到 jersey.config..classnames 初始化参数。你要么用一个 ResourceConfig 或与 Feature (并用init参数注册特性)

  1. @Provider
  2. public class MyFeature implements Feature {
  3. @Override
  4. pubic boolean configure(FeatureContext ctx) {
  5. ctx.register(new MyBinder());
  6. return true;
  7. }
  8. }

相关问题