Java CDI pas de coup de pied dans
Donc, ma première tentative de CDI est allée aux chiens. J'ai lu une tonne d'articles et essayé une variété d'exemples simples à complexes sans succès. Voici mon exemple actuel et simple. Ce que je fais mal?
Projet Maven:
Les Haricots.xml (situé dans 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>
de l'Imprimante.java
import javax.inject.Inject;
public class Printer {
@Inject Greeting greeting;
}
Salut.java
import javax.enterprise.inject.Default;
@Default
public class Greeting {
public void sayStuff(){ System.out.println("Stuff"); }
}
Principal.java
public class Main {
public static void main( String[] args ) {
new Printer().greeting.sayStuff();
}
}
L'Erreur
Il se construit bien, mais lors d'une tentative d'exécution, j'obtiens l'erreur
Exception dans le thread "main" java.lang.NullPointerException chez com.foo.App.CDI_test.Principal.principale(Main.java: 5)
Qui est précisément quand je tente d'invoquer sayStuff()
sur le salutation-propriété.
Pourquoi n'est-il pas instancié? Les tutoriels prétendent que @Default est également excessif. J'ai essayé d'utiliser à la fois une injection de custuctor et une injection de setter, pas de cigare.
EDIT 1 - ajout de pom.dépendances 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>
MODIFIER 2 - informations sur la version
- Java 1.7
- Eclipse Luna 4.4.0
- IntelliJ IDEA 13.1.4
2 answers
CDI fonctionne correctement dans le conteneur Java EE
Par exemple, essayez une webapp, une page jsp/jsf dans weblogic
En Java SE, vous devrez peut-être faire plus
Quel est le moyen le plus simple d'avoir CDI et JPA en Java SE?
Http://blog.rocketscience.io/dependency-injection-with-cdi-in-java-se/
Lorsque vous ne new Printer()
qui est responsable de l'injection de choses dans votre objet?
Il n'y a pas de dépendance entre CDI/Weld et EE. Cela fonctionne bien en SE. Pour l'exécuter en SE, vous devez démarrer le conteneur. Ceci est généralement fait par:
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();
}
Ce que vous ne pouvez pas faire est un accès direct aux champs, donc printer.greeting
ne fonctionnera pas, vous devez donc ajouter un getter. De plus, j'utilise CDI.current()
pour accéder au runtime. Vous devrez également ajouter org.jboss.weld.se:weld-se
à vos dépendances maven. Jetez un oeil à les documents de soudure pour référence.