Dependencias insatisfechas para el tipo […] con calificadores [@Default] en el punto de inyección (utilizando @BUSB con CDI)

Tengo el siguiente código para gestionar dos tipos de repositorios. Ambas clases de repositorio heredan una interfaz para permitir la reinicialización de sus recursos.

<code>public interface CachingRepository
{
    public void invalidateCache();
}
</code>

Repo global, de ámbito de aplicación:

<code>@Named("globalRepo")
@ApplicationScoped
public class GlobalRepository implements CachingRepository
{
    private List<Category> categories;

    ...

    @Override
    public void invalidateCache()
    {
        categories = null;
    }

    ...
}
</code>

Por usuario, repositorio de sesión:

<code>@Named("userRepo")
@SessionScoped
//@Stateful         // <- NOTE HERE
public class UserRepository implements CachingRepository, Serializable
{
    private List<MyFile> files;

    @Override
    public void invalidateCache()
    {
        files = null;
    }

    ...
}
</code>

Al inyectar esto (sin@Stateful) en el contexto

<code>@Named
@ViewScoped
public class MyHandler implements Serializable
{
    @Inject
    private UserRepository userRepo;

    ...
}
</code>

funciona. Sin embargo, al añadir@Stateful alUserRepository clase, la implementación falla con una excepción que dice:

<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>

Agregando el nombre del bean CDI como

<code>@Inject @Named("userRepo")
private UserRepository userRepo;
</code>

resultados en la misma excepción. Lo único que funciona en conjunto con@Stateful Es usar la interfaz en la declaración var:

<code>@Inject @Named("userRepo")
private CachingRepository userRepo;
</code>

Puede que necesite una funcionalidad de subclase aquí, sin embargo, así que usarCachingRepository No es realmente deseado (por el momento).

Q's:

¿Por qué no funciona esto como se esperaba? losUserRepository var ya debería identificar qué clase crear una instancia, ¿no es así? ¿Cuál es la lógica de esto?¿Por qué la@Stateful La anotación EJB tiene efectos tan severos aquí? ¿Por qué esencialmente me obliga a usar elCachingRepository ¿Interfaz en la declaración var?

Nota, Estoy usando Seam 3 Faces haciendo el@ViewScoped Conviértase en un bean CDI con vista, por lo que el problema actual es probableSolo CDI.

Respuestas a la pregunta(1)

Su respuesta a la pregunta