web-dev-qa-db-fra.com

WELD-001408: Dépendances non satisfaites pour le type Client avec qualificateurs @Default

Je suis un débutant en Java EE. Je veux tester JSF et donc faire un programme simple mais ne peux pas le déployer. Je reçois le message d'erreur suivant:

cannot Deploy onlineshop-war
deploy is failing=Error occurred during deployment: Exception while loading the app : CDI deployment failure:WELD-001408: Unsatisfied dependencies for type Customer with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private de.Java2enterprise.onlineshop.RegisterController.customer
at de.Java2enterprise.onlineshop.RegisterController.customer(RegisterController.Java:0)
. Please see server.log for more details.

Mon code est le suivant: Customer.Java:

package de.Java2enterprise.onlineshop.model;

public class Customer {
    private String email;
    private String password;
}

registerController.Java:

package de.Java2enterprise.onlineshop;

import Java.io.Serializable;
import javax.enterprise.context.RequestScoped;
import javax.inject.Named;
import javax.inject.Inject;
import de.Java2enterprise.onlineshop.model.*;

@Named
@RequestScoped
public class RegisterController {

    private static final long serialVersionUID = 1L;

    @Inject
    private Customer customer;

    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public String persist() {
        return "/index.xhtml";
    }
}

Pour le compiler, je devais inclure cdi-api.jar en tant que bibliothèque externe. Quelqu'un ici pourrait m'aider? Merci d'avance à tous.

29
mike128

Votre classe Customer doit être découverte par CDI en tant que haricot. Pour cela vous avez deux options:

  1. Mettez un haricot définissant une annotation dessus. Comme @Model est un stéréotype, c'est pourquoi il fait l'affaire. Un qualificatif comme @Named n'est pas un bean définissant une annotation, par ce que cela ne fonctionne pas

  2. Changez le mode de découverte bean dans votre archive de bean de la valeur par défaut "annotée" à "tout" en ajoutant un fichier beans.xml dans votre fichier jar.

Gardez à l'esprit que @Named n'a qu'un seul usage: exposer votre bean à l'interface utilisateur. D'autres utilisations concernent les mauvaises pratiques ou la compatibilité avec le framework existant.

50

c'est aussi une bonne chose de s'assurer que vous avez la bonne importation

J'ai eu un problème comme ça et j'ai découvert que le haricot utilisait

    javax.faces.view.ViewScoped;

au lieu de

    javax.faces.bean.ViewScoped;

Une seule parole peut parfois ruiner le monde ... ou tout simplement gâcher ma journée dans ce cas.

1
Sirmyself

J'ai eu le même problème mais cela n'avait rien à voir avec les annotations. Le problème est survenu lors de l'indexation des haricots dans mon conteneur (Jboss EAP 6.3). L'un de mes beans n'a pas pu être indexé car il utilisait des fonctionnalités Java 8 et j'ai reçu ce petit avertissement sournois lors du déploiement:

WARN [org.jboss.as.server.deployment] ... Impossible d'indexer la classe ... Java.lang.IllegalStateException: balise inconnue! pos = 20 poolCount = 133

Puis au point d'injection j'ai eu l'erreur:

Dépendances non satisfaites pour le type ... avec les qualificateurs @Default

La solution consiste à mettre à jour l'index d'annotations Java. télécharger la nouvelle version de jandex (jandex-1.2.3.Final ou plus récent) puis la mettre dans 

JBOSS_HOME\modules\system\layers\base\org\jboss\jandex\main puis met à jour la référence au nouveau fichier dans module.xml

REMARQUE: EAP 6.4.x a déjà résolu ce problème.

0
Mr.Q