Niezadowolone zależności dla typu […] z kwalifikatorami [@Default] w punkcie wtrysku (przy użyciu @Stateful EJB z CDI)
Mam następujący kod do zarządzania dwoma rodzajami repozytoriów. Obie klasy repozytoriów dziedziczą interfejs, aby umożliwić ponowne zainicjowanie ich zasobów.
<code>public interface CachingRepository { public void invalidateCache(); } </code>
Globalne repo o zasięgu aplikacji:
<code>@Named("globalRepo") @ApplicationScoped public class GlobalRepository implements CachingRepository { private List<Category> categories; ... @Override public void invalidateCache() { categories = null; } ... } </code>
Na użytkownika, repo o zasięgu sesji:
<code>@Named("userRepo") @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List<MyFile> files; @Override public void invalidateCache() { files = null; } ... } </code>
Podczas wstrzykiwania tego (bez@Stateful
) w kontekście
<code>@Named @ViewScoped public class MyHandler implements Serializable { @Inject private UserRepository userRepo; ... } </code>
to działa. Jednak podczas dodawania@Stateful
doUserRepository
klasa, wdrożenie nie powiedzie się z wyjątkiem:
<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>
Dodanie nazwy fasoli CDI
<code>@Inject @Named("userRepo") private UserRepository userRepo; </code>
powoduje ten sam wyjątek. Jedyna rzecz, która działa w połączeniu z@Stateful
jest użycie interfejsu w deklaracji var:
<code>@Inject @Named("userRepo") private CachingRepository userRepo; </code>
Mogę jednak potrzebować funkcji podklasy, więc używającCachingRepository
nie jest naprawdę pożądany (w tej chwili).
Q:
Dlaczego to nie działa zgodnie z oczekiwaniami? TheUserRepository
var powinien już zidentyfikować klasę do utworzenia instancji, prawda? Jaka jest logika tego?Dlaczego@Stateful
Adnotacja EJB ma tutaj tak poważne skutki? Dlaczego to zasadniczo zmusza mnie do używaniaCachingRepository
interfejs w deklaracji var?Uwaga, Używam Seam 3 Faces, co czyni@ViewScoped
stań się fasolą o zasięgu CDI, więc prawdopodobnie problem nadal występujeTylko CDI.