Jersey - 有没有办法用参数实例化每个请求资源?

San*_*oli 5 java rest resources jersey dropwizard

假设我有这个类:

@Path("/test")
public class TestResource{

   private TestService testService;

   public TestResource(TestService testService){
      this.testService = testService;
   }

   @GET
   public String getMessage(){
      return testService.getMessage();
   }


}
Run Code Online (Sandbox Code Playgroud)

然后,我想在泽西岛注册它。一个人会这样做:

 TestService testService = new TestServiceImpl();
 resourceConfig.register(new TestResource(testService));
Run Code Online (Sandbox Code Playgroud)

但问题是这种方法只创建了一个 TestResource 实例。我想为每个请求创建一个实例。所以,Jersey 有办法做到这一点:

 TestService = new TestServiceImpl();
 resourceConfig.register(TestResource.class);
Run Code Online (Sandbox Code Playgroud)

太棒了!但它不允许我将实例化参数传递给它的构造函数。

最重要的是,我正在使用 DropWizard,它也不允许我访问 ResourceConfig 中的所有方法(但我检查了它的文档并没有找到任何让我传递参数的方法)

所以我想知道是否有办法实现这一点。

谢谢!

PS:我知道我可以使用 Spring 或 Guice(或我自己的实例提供者)并注入我的类来逃避这个问题,但我不想这样做(当然,如果这是唯一的方法,我会这样做)

Nat*_*tan 1

正如 @peeskillet 提到的,jersey 2.x 与 HK2 紧密耦合,似乎这是向其传递服务的唯一方法。

@Singleton
@Path("/test")
public class TestResource {

   private TestService testService;

   @Inject
   public TestResource(TestService testService){
      this.testService = testService;
   }

   @GET
   public String getMessage(){
      return testService.getMessage();
   }
}
Run Code Online (Sandbox Code Playgroud)

这就是您注册的方式:

environment.jersey().register(new AbstractBinder(){
   @Override
   protected void configure() {
      bind(TestServiceImpl.class).to(TestService.class);
      // or
      bind(new TestServiceImpl()).to(TestService.class);
   });
environment.jersey().register(TestResource.class);
Run Code Online (Sandbox Code Playgroud)