当前位置: 首页 > 知识库问答 >
问题:

在ResourceContext initResource创建的JAX-RS子资源实例中不可能进行CDI注入

薛宇
2023-03-14
@Context
ResourceContext rc;

@Path("reports")
public ReportsResource reportsResource() {
    return rc.initResource(new ReportsResource());
}

报表子资源

@Inject
ReportsService rs;

@GET
@Path("{rptno}")
@Produces(MediaType.APPLICATION_XML)
public Report report(@PathParam("rptno") int rptNumber) throws Exception {
    return rs.getReport(rptNumber);
}

我使用Java EE7和Glassfish和WAS Liberty配置文件的经验是,没有注入ReportService rs实例,使rs为空并导致NPE。

我的假设是,因为resource类正在执行“new ReportsResource()”,所以CDI对ReportsResource实例没有可见性,因此ReportsResource不是容器管理的。这似乎与这个问题相同,当通过ResourceContext获得子资源时,将EJB注入JAX-RS2.0子资源

@Inject
ReportsSerivce rs;

@Context
ResourceContext rc;

@Path("reports")
public ReportsResource reportsResource() {
    return rc.initResource(new ReportsResource(rs));
}
public class ReportsResource {
    private ReportsSerivce rs;

    public ReportsResource(ReportsSerivce rs) {
      this.rs = rs;
    }

    @Context
    HttpHeaders headers;

    @GET
    @Path("{rptno}")
    @Produces(MediaType.APPLICATION_XML)
    public Report report(@PathParam("rptno") int rptNumber) throws Exception {
        return rs.getReport(rptNumber);
    }
  1. 我关于@inject失败原因的假设是否正确?
  2. 是否有任何方法使@inject在子资源中工作?
  3. 是否有更好的解决方案将ReportService实例从资源传递到更像“CDI/Java EE”的子资源?

共有1个答案

易研
2023-03-14

如果希望将CDI bean注入JAX-RS资源,我不建议使用rc.initresource。它所做的只是将字段注入到现有对象中,但它使用JAX-RS特定的机制,类似于当CDI不可用时JavaEE5中EJB的注入工作方式。

最好使用CDI并从代码中删除resourceContext

示例:

@Inject
private ReportsResource reportsResource;

@Path("reports")
public ReportsResource reportsResource() {
    return reportsResource;
}
@Inject
private Instance<ReportsResource> reportsResources;

@Path("reports")
public ReportsResource reportsResource() {
    return reportsResources.get();
}
 类似资料:
  • service.java: sqlDataProvider.java: 如果在Glassfish服务器中部署此servlet并执行请求,将引发以下异常: 亲切地问候帕斯卡

  • 问题内容: 我一直在尝试使用NetBeans Ide创建一个简单的Restful WebService。 我的Java EE版本是:Java EE 7 Web。 我创建了一个新的Java Web应用程序,设置此ContexPath: 。 现在,运行我的应用程序,浏览器在以下位置显示我的页面: 因此,一切正常。 然后,我尝试使用RESTful Web服务向导创建一个简单的Restful资源。 因此,

  • 我正在尝试构建一个RESTful web服务。该组件是对已包含多个servlet的现有Tomcat7Web应用程序的添加。我用的是泽西2.25。 我需要实例化一些与现有系统相关的组件(对象)。我希望在应用程序加载时这样做一次,然后从每个资源中读取它们。 和资源: 我不明白为什么我会得到这个例外: ServletException:一个MultiException有3个异常。他们是:1。org.gl

  • 我正在泽西岛应用程序中使用 CDI。在根资源上,CDI 注入按预期工作,但每当我返回子资源时,CDI 注入源都不可用。 具有子资源定位器的根资源: 子资源: 错误: 我正在使用和Weld依赖项,在Undertow上运行,并将Weld servlet侦听器添加到部署中。 同样,对根资源的相同注入确实有效。< code>@Named("name ")字符串由< code>@ApplicationSco

  • 问题内容: REST资源版本控制的最佳做法是将版本信息放入HTTP请求的Accept / Content-Type标头中,而URI保持不变。 这是对REST API的示例请求/响应,用于检索系统信息: 请注意,版本是在MIME类型中指定的。 这是版本2的另一个请求/响应: 有关更多说明和示例,请参见http://barelyenough.org/blog/tag/rest- versioning/

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource