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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage