2014-09-10 5 views
0

Итак, моя первая попытка на CDI подошла к собакам. Я прочитал тонну статей и без особых усилий пробовал множество простых и сложных примеров. Вот мой текущий, простой пример. Что я делаю не так?Java CDI не пинает

Maven проекта:

beans.xml (находится в SRC/основные/ресурсы/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(); 
    } 
} 


Ошибка
Он строит хорошо, но при попытке ред запустить я получаю ошибку

Исключение в потоке "главный" java.lang.NullPointerException в com.foo.app.CDI_test.Main.main (Main.java:5)

который именно тогда, когда я пытаюсь вызвать sayStuff() на приветствие-свойство. Почему это не создается? Учебники требуют, чтобы @Default также был чрезмерным. Я попытался использовать как инъекцию, так и инъекцию, а не сигару.

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> 

РЕДАКТИРОВАТЬ 2 - информация о версии
- Java 1.7
- Затмение Луны 4.4.0
- IntelliJ IDEA 13.1.4

ответ

0

CDI отлично работает в контейнере Java EE

например. попробуйте веб-приложение, JSP/JSF страницы внутри WebLogic

В 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(), кто несет ответственность за инъекционного материала в вашем объект?

+0

Weld CDI не должен зависеть от того, что он является webapp, не так ли? – krystah

+0

необходимо инициализировать сварку, см. Мое обновление –

+0

Это не должно быть необходимым, я прочитал как минимум 5 разных статей, в которых бобы извлекаются без явного запроса через контейнер! – krystah

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 не будет работать, поэтому вам нужно добавить поглотитель. Кроме того, я использую CDI.current() для доступа к среде выполнения. Вам также нужно добавить org.jboss.weld.se:weld-se к вашим зависимостям maven. Посмотрите на the weld docs для справки.

Смежные вопросы