Java CDI没有踢

时间:2014-09-10 14:45:52

标签: java maven weld

所以,我对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

2 个答案:

答案 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以供参考。