所以,我对CDI的第一次尝试是去了狗。我已经阅读了大量的文章,尝试了各种简单到复杂的例子而没有成功。这是我目前的简单例子。我做错了什么?
Maven项目:
beans.xml (位于src / main / resources / META-INF)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1"
bean-discovery-mode="all">
</beans>
的 Printer.java
import javax.inject.Inject;
public class Printer {
@Inject Greeting greeting;
}
的 Greeting.java
import javax.enterprise.inject.Default;
@Default
public class Greeting {
public void sayStuff(){ System.out.println("Stuff"); }
}
的 Main.java
public class Main {
public static void main( String[] args ) {
new Printer().greeting.sayStuff();
}
}
错误
它构建良好,但在尝试运行时我得到错误
线程“main”java.lang.NullPointerException中的异常 在com.foo.app.CDI_test.Main.main(Main.java:5)
正是当我尝试在greeting-property上调用sayStuff()
时。
为什么没有实例化?教程声称@Default也是过分的。我尝试过使用custructor-injection和setter-injection,没有雪茄。
编辑1 - 添加了pom.xml依赖项
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>1.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se</artifactId>
<version>2.2.4.Final</version>
</dependency>
</dependencies>
编辑2 - 版本信息
- Java 1.7
- Eclipse Luna 4.4.0
- IntelliJ IDEA 13.1.4
答案 0 :(得分:0)
CDI在Java EE容器中运行良好
e.g。尝试weblogic中的webapp,jsp / jsf页面
在Java SE中,您可能需要执行更多操作
What is the easiest way to have CDI and JPA in Java SE?
http://blog.rocketscience.io/dependency-injection-with-cdi-in-java-se/
当你new Printer()
负责在对象中注入东西时?
答案 1 :(得分:0)
CDI / Weld和EE之间没有依赖关系。它在SE中运行良好。虽然你需要启动容器,但是要在SE中运行它。这通常通过以下方式完成:
public static void main( String[] args ) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
Printer printer = CDI.current().select(Printer.class).get();
printer.getGreeting().sayStuff();
}
您不能做的是直接字段访问,因此printer.greeting
无法正常工作,因此您需要添加一个getter。另外,我使用CDI.current()
来访问运行时。您还需要将org.jboss.weld.se:weld-se
添加到您的maven依赖项中。请查看the weld docs以供参考。