web-dev-qa-db-fra.com

Dépendances non satisfaites pour le type [...] avec des qualificatifs [@Default] au point d'injection (en utilisant @Stateful EJB avec CDI)

J'ai le code suivant pour gérer deux types de référentiels. Les deux classes de référentiel héritent d'une interface pour permettre la réinitialisation de leurs ressources.

public interface CachingRepository
{
    public void invalidateCache();
}

Repo global, à l'échelle des applications:

@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
    private List<Category> categories;

    ...

    @Override
    public void invalidateCache()
    {
        categories = null;
    }

    ...
}

Repo par utilisateur, à l'échelle de la session:

@Named("userRepo")
@SessionScoped
//@Stateful         // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
    private List<MyFile> files;

    @Override
    public void invalidateCache()
    {
        files = null;
    }

    ...
}

Lors de l'injection de ceci (sans @Stateful) dans le contexte

@Named
@ViewScoped
public class MyHandler implements Serializable
{
    @Inject
    private UserRepository userRepo;

    ...
}

ça marche. Cependant, lors de l'ajout de @Stateful à la classe UserRepository, le déploiement échoue avec une exception disant:

Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408 Unsatisfied dependencies for type [UserRepository] with qualifiers [@Default] at injection point [[field] @Inject private de.company.project.pack.MyHandler.userRepo]
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.Java:275)
    at org.jboss.weld.bootstrap.Validator.validateInjectionPoint(Validator.Java:244)
    at org.jboss.weld.bootstrap.Validator.validateBean(Validator.Java:107)
    at org.jboss.weld.bootstrap.Validator.validateRIBean(Validator.Java:127)
    at org.jboss.weld.bootstrap.Validator.validateBeans(Validator.Java:346)
    at org.jboss.weld.bootstrap.Validator.validateDeployment(Validator.Java:331)
    at org.jboss.weld.bootstrap.WeldBootstrap.validateBeans(WeldBootstrap.Java:366)
    at org.jboss.as.weld.WeldContainer.start(WeldContainer.Java:83)
    at org.jboss.as.weld.services.WeldService.start(WeldService.Java:76)
    ... 5 more

Ajout du nom du bean CDI comme

@Inject @Named("userRepo")
private UserRepository userRepo;

entraîne la même exception. La seule chose qui fonctionne en conjonction avec @Stateful consiste à utiliser l'interface dans la déclaration var:

@Inject @Named("userRepo")
private CachingRepository userRepo;

Cependant, je pourrais avoir besoin d'une fonctionnalité de sous-classe ici, donc l'utilisation de CachingRepository n'est pas vraiment souhaitée (pour le moment).

Q's:

  1. Pourquoi cela ne fonctionne-t-il pas comme prévu? Le UserRepository var devrait déjà identifier la classe à instancier, n'est-ce pas? Quelle est la logique de cela?
  2. Pourquoi le @Stateful Les annotations EJB ont des effets si graves ici? Pourquoi cela me force-t-il essentiellement à utiliser l'interface CachingRepository dans la déclaration var?

Note, j'utilise Seam 3 Faces faisant le @ViewScoped devient un bean à portée de vue CDI, donc le problème à résoudre est probablement toujours CDI uniquement.

16
Kawu

J'ai eu le même problème avec cette exception trompeuse ...

En ajoutant @Stateful à UserRepository vous exposez les méthodes EJB de l'interface CachingRepository sans qu'une vue sans interface soit déclarée. Ajouter @LocalBean à UserRepository pour activer la vue sans interface. Voir la spécification EJB 3.1, Section 4.9.8 "Vue sans interface du bean de session"

La classe de bean doit indiquer qu'elle expose une vue sans interface via sa définition de classe de bean ou dans le descripteur de déploiement. Les règles suivantes s'appliquent:

  • ...
  • Si le bean expose au moins une autre vue client, le bean indique qu'il expose une vue sans interface au moyen de l'annotation @LocalBean sur la classe du bean ou dans le descripteur de déploiement.
  • ...

Je me réfère également à this stackoverflow answer pour plus d'informations sur les vues sans interface.

10
kraftan

J'ai eu la même erreur.

Provoqué par: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Dépendances non satisfaites pour le type UserTransaction avec des qualificatifs @Default au point d'injection [BackedAnnotatedField] @Inject ...

J'ai résolu ce problème comme ceci: j'ai utilisé UserTransaction de cette façon lorsque j'ai reçu une erreur.

@Inject
UserTransaction trans;

Au lieu de @Inject, J'ai utilisé @Resource annotation.

1
Remziye Şahin

J'ai eu le même problème. J'espère que cela peut aider quelqu'un.

Résoudre le problème:

  • Faites un clic droit sur le projet
  • Cliquez sur Properties
  • trouver Project facets
  • Sur Project facets, active l'option CDI
  • Postulez et enregistrez.

Maintenant tout va bien.

0
hubert

J'ai eu le même problème.

Et voici ce que j'ai fait pour le résoudre:

J'ai dû produire l'EJB que j'essaie d'injecter comme ci-dessous avec un conteneur wildfly:

@ApplicationScoped
    public class Resources {
     private static final String DISCOUNT_SERVICE_ENDPOINT_PROPERTY =
        "services.discount.endpoint";
     private MyServiceImpl myService;
    }

@Produces
 public MyServiceImpl produceMyServiceImpl() {
     if (myService == null) {
         String endpoint = System.getProperty(DISCOUNT_SERVICE_ENDPOINT_PROPERTY);
        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(MyServiceImpl.class);
        factory.setServiceName(MyService.SERVICE);
        factory.setAddress(endpoint);
        myService = (MyServiceImpl) factory.create();
     }
     return myService;

}

Ce qui suit est une configuration qui va sous votre fichier standalone-full.xml.

<property name="services.discount.endpoint" value="http://localhost:8080/my_service/MyService/MyServiceImpl"/>
0
Sydney Molobela

Vous devriez peut-être ajouter un constructeur non paramétré sur la classe du bean. J'ai lu sur Jboss Documentation qui dit: concret Java classe qui a un constructeur sans paramètres (ou un constructeur désigné avec l'annotation @Inject) est un bean.

0
Ricky Benitez