Unbefriedigte Abhängigkeiten für Typ […] mit Qualifizierern [@Default] am Injektionspunkt (mit @Stateful EJB mit CDI)
Ich habe den folgenden Code zum Verwalten von zwei Arten von Repositorys. Beide Repository-Klassen erben eine Schnittstelle, um eine Neuinitialisierung ihrer Ressourcen zu ermöglichen.
<code>public interface CachingRepository { public void invalidateCache(); } </code>
Globales, anwendungsspezifisches Repo:
<code>@Named("globalRepo") @ApplicationScoped public class GlobalRepository implements CachingRepository { private List<Category> categories; ... @Override public void invalidateCache() { categories = null; } ... } </code>
Pro Benutzer sitzungsbezogenes Repo:
<code>@Named("userRepo") @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List<MyFile> files; @Override public void invalidateCache() { files = null; } ... } </code>
Beim Injizieren dieses (ohne@Stateful
) in den Kontext
<code>@Named @ViewScoped public class MyHandler implements Serializable { @Inject private UserRepository userRepo; ... } </code>
Es klappt. Beim Hinzufügen jedoch@Stateful
zumUserRepository
Klasse schlägt die Bereitstellung mit der folgenden Ausnahme fehl:
<code>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 </code>
Hinzufügen des Namens der CDI-Bean wie
<code>@Inject @Named("userRepo") private UserRepository userRepo; </code>
führt zu derselben Ausnahme. Das einzige, was in Verbindung mit funktioniert@Stateful
soll die Schnittstelle in der var-Deklaration verwenden:
<code>@Inject @Named("userRepo") private CachingRepository userRepo; </code>
Möglicherweise benötige ich hier jedoch eine UnterklassenfunktionalitätCachingRepository
ist (im Moment) nicht wirklich erwünscht.
Q's:
Warum funktioniert das nicht wie erwartet? DasUserRepository
var sollte bereits identifizieren, welche Klasse instanziiert werden soll, oder? Was ist die Logik dazu?Warum macht das@Stateful
EJB-Annotation haben hier so gravierende Auswirkungen? Warum zwingt es mich im Wesentlichen dazu, das zu benutzen?CachingRepository
Schnittstelle in der var-Deklaration?HinweisIch benutze Seam 3 Faces, um die@ViewScoped
eine CDI-View-Scoped-Bean werden, so dass das vorliegende Problem wahrscheinlich immer noch bestehtNur CDI.