【问题标题】:JAX-RS: Dependency Injection with Shutdown/Destroy/DisposeJAX-RS:关闭/销毁/处置的依赖注入
【发布时间】:2013-07-15 14:16:11
【问题描述】:

实际问题

我正在尝试使用 Jersey 2.0 创建一个简单的 JAX-RS Application,如下所示:

@ApplicationPath("")
public class MyService extends ResourceConfig {

  public MyService() {

    packages(MyService.class.getPackage().getName());
    register(new ApplicationBinder());
  }


  private static class ApplicationBinder extends AbstractBinder {

    @Override
    protected void configure() {

      MyDependency dep = new MyDependency();
      bind(dep).to(MyDependency.class);
      // TODO properly shutdown/destroy/dispose "dep" somewhere
    }

  }

}

MyDependency 对象的创建成本有点高,它们有一个 shutdown() 方法,需要在销毁之前调用。我应该在哪里以及如何使用 JAX-RS 执行此类清理任务?

更多背景(如果需要)

使用创建的 MyDependency 对象的 JAX-RS 资源实现如下所示 - 如果这与问题有任何相关性:

@Path("getit")
@Singleton
public class MyResource {

  private final MyDependency dependency;

  @Inject
  public MyResource(MyDependency dependency) {

    this.dependency = dependency;
  }

  @GET
  @Produces(MediaType.TEXT_HTML)
  public String getIt() {

    return this.dependency.getIt();
  }

}

【问题讨论】:

  • 什么时候需要处理MyDependency?另外,您使用的是 JavaEE 7 应用服务器(即 Glassfish)吗?
  • @CarloPellegrini MyDependency 需要在 servlet 为 destroyed 时正确关闭。我的目标是任何与 Servlet 3.0 兼容的容器,理想情况下无需编写 web.xml 文件(因此有 @ApplicationPath 注释)。

标签: dependency-injection jax-rs jersey-2.0


【解决方案1】:

Servlet 3.0 兼容容器意味着你不能依赖 CDI 可用,所以我们对 hk2 感到震惊。

MyDependency 上实现org.glassfish.hk2.api.PreDestroy 应该指示绑定框架进行适当的清理。

在关机时hk2应该调用接口定义的preDestroy()方法。

【讨论】:

  • 感谢您的回答。我尝试使用MyDependencyApplicationBinder 来实现PreDestroy。但是,从未调用过两个 preDestroy() 方法。我已经用 Jetty 9.0.4.v20130625 对此进行了测试,它应该支持Servlet 3.0 since version 8.x。有什么想法可能是错的吗?
  • PreDestroy 和 PostConstruct 仅在您的类是容器管理的情况下才有效,这可能是问题所在(或者至少对我来说是这样)
猜你喜欢
  • 2017-03-28
  • 2010-11-26
  • 2016-07-13
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多