gpt4 book ai didi

java - 我可以在 Jersey 1.x 中使用 CDI @Inject 类吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:48:28 24 4
gpt4 key购买 nike

我想我是在问这个问题,但对于 Jersey 1.x: Dependency injection with Jersey 2.0

我正在使用 Glassfish 3、CDI 和 Jersey 1.x。我有一个 @WebService 正在注入(inject)这样的类:

@Inject
Foo foo;

我已经在 @WebService 中对此进行了测试,它可以正常工作。但是当它尝试使用 foo 时,我的 Jersey 资源中的同一行代码会抛出 NPE。我认为 Jersey 1.x 忽略了 CDI 注释。如何让依赖注入(inject)像在我的 @WebService 中那样工作?

Foo 是一个 pojo,我的 web.xml 使用 ServletContainer:

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

我找到了 some help here 。问题是我的 Foo @Inject 有它自己的 bean(它们实际上是来自一个带有 @Provides 的类的 EJB)。 resourceContext.getResource(Foo.class); 返回一个 Foo 的实例,但是 foo@Inject字段为空。

最佳答案

我找到了 an article这解释了如何做到这一点:

The problem here is, that CDI isn’t in place to instantiate the dependency. Their[sic] are two solutions for this problem:

  1. Let CDI instantiate the dependency, but let Jersey managed it This can be achived using @ManagedBean and a Jersey specific annotation.
  2. Let CDI instantiate the dependency and let CDI manage it. This can be achieved using @RequestScoped or other CDI specific annotations.

我选择了第一个选项并将 javax.annotation.ManagedBean 注释放在我的资源上。 Here's an example :

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

关于java - 我可以在 Jersey 1.x 中使用 CDI @Inject 类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994058/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com