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:
UserRepository
var devrait déjà identifier la classe à instancier, n'est-ce pas? Quelle est la logique de cela?@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.
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.
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.
J'ai eu le même problème. J'espère que cela peut aider quelqu'un.
Résoudre le problème:
Properties
Project facets
Project facets
, active l'option CDIMaintenant tout va bien.
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"/>
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.