java - 无法轻松注入(inject) CDI Bean

标签 java jax-rs jboss7.x cdi resteasy

我无法在 Resteasy 中注入(inject) cdi bean。调试时似乎总是显示空指针异常。即下面代码中的“jaxRsImpl”始终为空。我正在尝试在 jboss eap 6.2 上运行

@Path("/jaxrs-service")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class JAXRSService {

    @Inject
    private JAXRSImpl jaxRsImpl;

    @POST
    @Path("/authenticate")
    @Consumes(MediaType.APPLICATION_JSON)
    public Response authenticate(Credentials user) {
           return jaxRsImpl.authenticate(user);
    }

}

我打算注入(inject)的类是

@RequestScoped
public class JAXRSImpl {
    public Response authenticate(Credentials user) {
    // Some logic

    }
}

因为我的应用程序是 web,所以我在 WEB-INF 文件夹中添加了 beans.xml

我的初始化程序看起来像

@ApplicationPath("/rest")
public class JAXRSInitializer extends Application {
   private Set<Object> singletons = new HashSet<Object>();
   private Set<Class<?>> classes = new HashSet<Class<?>>();

   public JAXRSInitializer() {
      singletons.add(new JAXRSService());
      classes.add(JAXRSImpl.class);
   }

   @Override
   public Set<Class<?>> getClasses() {
     return classes;
   }

   @Override
   public Set<Object> getSingletons() {
     return singletons;
   }
}

最佳答案

您需要确保您的应用程序是 CDI 感知的。以下是一些关键要求:

  • 在 JAX-RS 中,不要列出您的类/单例。让容器发现它们。基本上创建一个空的 Application 实现。
  • 确保你有一个有效的 beans.xml
  • 确保您的其余端点具有有效范围 - 例如@RequestScoped

第一个项目符号是关键,因为您是手动实例化您的服务,而不是让容器找到它们。

关于java - 无法轻松注入(inject) CDI Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27338403/

相关文章:

java - 具有原生 @WebService 支持的可嵌入 Web 服务器,作为 Endpoint.publish 的替代方案

java - android中如何获取drawable图片路径?

java - 服务器如何将 URI 模式绑定(bind)到特定的 Java 类?

rest - 创建一个接受 POST 和 GET 的 Jax-RS RESTful 服务?

java - Jersey 的 EntityHolder 类型中的层次结构

java - 独立程序中的 slf4j、log4j 和 JBoss 7 logmanager => 没有任何结果

java - ArrayList 组项目

jsf-2 - JSF 对话

java - 注入(inject) HttpServletRequest

java - Java 中的 org.w3c.dom.Node 和 Node 有什么区别?