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

Author: krystah, 2014-09-10

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?

 0
Author: Kalpesh Soni, 2017-05-23 12:12:46

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.

 0
Author: John Ament, 2014-09-21 16:17:21