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

我可以使用 CDI 在泽西岛 1.x 中@Inject课程吗?

何烨华
2023-03-14

我想我在问这个问题,但对于Jersey 1.x:Jersey 2.0的依赖注入

我使用的是Glassfish 3、CDI和Jersey 1.x。我有一个< code>@WebService正在注入这样一个类:

@Inject
Foo foo;

我已经在@WebService中对此进行了测试,并且它有效。但是,当我的泽西岛资源中的同一行代码在尝试使用 foo 时会引发 NPE。我认为泽西岛 1.x 忽略了 CDI 注释。如何使依赖关系注入像在@WebService中一样工作?

Foo是一个pojo和我的网站。xml正在使用ServletContainer:

<servlet>
    <servlet-name>JerseyServlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

我在这里找到了一些帮助。问题是我的< code > Foo < code > @ Inject 有自己的beans(它们实际上是EJB,来自一个包含< code>@Provides的类)。< code > resource context . get resource(foo . class);返回< code>Foo的实例,但< code>foo的< code>@Injected字段为空。

共有1个答案

白子明
2023-03-14

我找到了一篇解释如何做到这一点的文章:

这里的问题是,CDI不适合实例化依赖项。他们的[sic]是这个问题的两个解决方案:

  1. 让CDI实例化依赖项,但让Jersey管理它。这可以使用@ManagedBean和Jersey特定的注释来实现
  2. 让CDI实例化依赖项并让CDI管理它。这可以使用@RequestScoped或其他特定于CDI的注释来实现

我选择了第一个选项,并将javax.annotation.ManagedBean注释放在我的资源上。这是一个例子:

package com.coderskitchen.thegreeter.rest;

import com.coderskitchen.thegreeter.greetings.GreetingService;

import javax.annotation.ManagedBean;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;

@Path("/greet")
@ManagedBean
public class Greeter {
    @Inject
    GreetingService gs;
    @GET
    @Path("{name}")
    public String greetSomeone(@PathParam("name") String name) {
        return gs.greetSomeone(name);
    }
}

*我也发现了这篇官方文章,实际上并不那么有用:http://docs.oracle.com/javaee/7/tutorial/doc/jaxrs-advanced004.htm

 类似资料:
  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 编辑:这是ackson jaxrs-base早期版本中的一个问题,已在jackson-jaxrs-base-2.8中解决。https://github.com/FasterXML/jackson-jaxrs-providers/issues/22 我正在努力解决这个问题,只有mapper例外。我想映射com的所有子级。fasterxml。杰克逊。果心JsonProcessingException在

  • 问题内容: 我有一个Jersey REST API,并且正在使用来处理授权。我还在所有端点上使用,以便我的API可以处理数千个并发请求。 我的授权过滤器命中了一个远程服务,但是当运行过滤器时,Jersey尚未将当前线程添加到它的内部,因此我完全失去了异步的好处。 我可以告诉Jersey我希望这是异步的吗? 这是一个示例资源: 更新 刚刚收到泽西队球员的回音,从2.7开始,这是不可能的。只有资源方法

  • 我很难理解泽西岛的注入机制。JAX-RS规范(http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-520005)指出,在应用程序子类、根资源类和提供程序中可以通过@Context进行注入。 我现在有一个在启动时实例化的类,并且有一个在每次请求时调用的方法。在方法内部,我需要访问当前的UriInfo对象。问题是,这个方法不是从我的

  • 我正在泽西岛2中编写一个RESTful网络服务。我想支持响应的 Gzip 编码。按照这个答案,我在我的类中启用了。 在我的资源类中,我返回一个对象。 现在,当我点击这个api时,我得到一个响应,但响应头不包含头,而是包含 header。 请求: 响应: 响应中没有 标头,也没有任何标头。 我在上使用。 我还遗漏了其他配置吗?我如何获得这两个头并得到gzip压缩的响应,而不是接收分块的响应? 编辑:

  • 注释如何在Jersey中工作,以便对特定的资源方法或资源类应用筛选器? 请考虑以下注释: 它是如何工作的?