【问题标题】:CDI not workingCDI 不工作
【发布时间】:2013-05-08 04:42:41
【问题描述】:

这是我第一次尝试 CDI。我有一个 Eclipse Kepler 环境,我有一个部署在内部 Glassfish 4.0 运行时上的 Maven Web 项目。

它有一个 servlet 和一个 JAX-RS 资源 POJO,两者都可以正常工作。接下来,我在与 servlet 和 JAX-RS POJO 相同的包中创建了一个类:

package com.example.test;

import java.util.logging.Logger;

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.inject.Produces;

@ApplicationScoped
public class Bean {

  @Produces @ApplicationScoped
  public static Bean produce () {
    return new Bean();
  }

  public Bean () {
    Logger.getGlobal().info("Bean()");
  }

}

我修改了 POJO:

package com.example.test;

import javax.annotation.Resource;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;

@Resource(name = "foo", type = Rest.class)
@Path("/rest")
public class Rest {

  @Inject Bean b;

  @GET
  @Produces("text/html")
  public String f () {
    return "<h1>rest</h1>";
  }
}

当我访问 POJO 的休息路径时,我在 Glassfish 日志中收到消息:

WARNING: StandardWrapperValve[com.younum.web.test.App]: Servlet.service() for servlet com.example.test.App threw exception
org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at Injectee(requiredType=Bean,parent=Rest,qualifiers={}),position=-1,optional=false,self=false,unqualified=null,1573724652)

当我尝试访问 POJO 时,这也会在网页上显示为异常。

我做错了什么?我觉得 Web 项目以某种方式不会触发 CDI,我不确定将其转换为 Java EE 项目需要什么。 pom.xml 如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.younum.web</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>war</packaging>
</project>

【问题讨论】:

    标签: java jakarta-ee dependency-injection glassfish cdi


    【解决方案1】:

    您的 META-INF 文件夹中需要 beans.xml 文件。 默认情况下,我们在部署项目时不会启用或激活 CDI。所以要激活它,我们需要 beans.xml 文件,它应该位于 meta-inf 文件夹下。

    下面是示例 beans.xml

    <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
    http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    </beans>
    

    这是一个很好的开始链接 http://oppansource.blogspot.in/2013/05/cdi-in-nutshell.html

    【讨论】:

    • 嗯,不太正确,但因为它有帮助而被赞成。该标准允许 beans.xml 的多个位置。 glassfish 可能有问题。
    【解决方案2】:

    这是与 Eclipse Kepler m6 捆绑的 glassfish 版本的问题。当我使用独立的 Glassfish 4.0-b87 时,它运行良好。

    【讨论】:

      猜你喜欢
      • 2016-01-03
      • 1970-01-01
      • 2014-05-11
      • 2014-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多