【问题标题】:Java CDI not kicking inJava CDI 没有启动
【发布时间】:2014-11-04 06:45:59
【问题描述】:

所以,我第一次尝试 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)

这正是我尝试在问候属性上调用sayStuff() 的时候。 为什么它没有被实例化?教程声称 @Default 也过分了。我尝试过同时使用 custructor-injection 和 setter-injection,没有雪茄。

EDIT 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>

EDIT 2 - 版本信息
- Java 1.7
- Eclipse Luna 4.4.0
- IntelliJ IDEA 13.1.4

【问题讨论】:

    标签: java maven weld


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      CDI 在 Java EE 容器中运行良好

      例如在 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() 时,谁负责在您的对象中注入东西?

      【讨论】:

      • Weld CDI 不应该依赖于它是一个 web 应用程序,不是吗?
      • 这不应该是必要的,我已经阅读了至少 5 篇不同的文章,其中无需通过容器明确询问即可获取 bean!
      • 我可以试试,给个链接好吗?
      • Kalpesh 试图告诉您:CDI 不是“魔法”,必须有人初始化应用程序。在 Java SE 环境中,那个人就是你。
      猜你喜欢
      • 2014-02-02
      • 2015-02-03
      • 2014-12-11
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多