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.

questionAnswers(1)

yourAnswerToTheQuestion