这是我第一次尝试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>
答案 0 :(得分:4)
您的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
答案 1 :(得分:2)
与Eclipse Kepler m6捆绑在一起的glassfish版本存在问题。当我使用Standalong Glassfish 4.0-b87时它工作正常。