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.