Dependências insatisfeitas para o tipo […] com qualificadores [@Default] no ponto de injeção (usando @Estateful EJB com CDI)
Eu tenho o seguinte código para gerenciar dois tipos de repositórios. Ambas as classes de repositório herdam uma interface para permitir a reinicialização de seus recursos.
<code>public interface CachingRepository { public void invalidateCache(); } </code>
Repo global, com escopo de aplicativo:
<code>@Named("globalRepo") @ApplicationScoped public class GlobalRepository implements CachingRepository { private List<Category> categories; ... @Override public void invalidateCache() { categories = null; } ... } </code>
Por usuário, repo com escopo de sessão:
<code>@Named("userRepo") @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List<MyFile> files; @Override public void invalidateCache() { files = null; } ... } </code>
Ao injetar isso (sem@Stateful
) no contexto
<code>@Named @ViewScoped public class MyHandler implements Serializable { @Inject private UserRepository userRepo; ... } </code>
funciona. No entanto, ao adicionar@Stateful
aoUserRepository
classe, a implantação falha com uma exceção dizendo:
<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>
Adicionando o nome do bean CDI como
<code>@Inject @Named("userRepo") private UserRepository userRepo; </code>
resulta na mesma exceção. A única coisa que funciona em conjunto com@Stateful
é usar a interface na declaração var:
<code>@Inject @Named("userRepo") private CachingRepository userRepo; </code>
Eu posso precisar da funcionalidade subclasse aqui, então, usandoCachingRepository
não é realmente desejado (no momento).
Q's:
Por que isso não está funcionando como esperado? oUserRepository
var já deve identificar qual classe instanciar, não deveria? Qual a lógica disso?Por que o@Stateful
Anotação EJB tem efeitos tão graves aqui? Por que essencialmente me forçar a usar oCachingRepository
interface na declaração var?Nota, Eu estou usando o Seam 3 Faces fazendo o@ViewScoped
tornar-se um bean com escopo de visão CDI, então o problema em questão ainda é provávelApenas CDI.