Неудовлетворенные зависимости для типа […] с квалификаторами [@Default] в точке внедрения (используя @Stateful EJB с CDI)
У меня есть следующий код для управления двумя видами хранилищ. Оба класса репозитория наследуют интерфейс для повторной инициализации своих ресурсов.
<code>public interface CachingRepository { public void invalidateCache(); } </code>
Глобальное репо в области приложения:
<code>@Named("globalRepo") @ApplicationScoped public class GlobalRepository implements CachingRepository { private List<Category> categories; ... @Override public void invalidateCache() { categories = null; } ... } </code>
Для каждого пользователя в репозитории сессий:
<code>@Named("userRepo") @SessionScoped //@Stateful // <- NOTE HERE public class UserRepository implements CachingRepository, Serializable { private List<MyFile> files; @Override public void invalidateCache() { files = null; } ... } </code>
При введении этого (без@Stateful
) в контекст
<code>@Named @ViewScoped public class MyHandler implements Serializable { @Inject private UserRepository userRepo; ... } </code>
оно работает. Однако при добавлении@Stateful
кUserRepository
класс, развертывание завершается неудачно с исключением:
<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>
Добавление имени компонента CDI как
<code>@Inject @Named("userRepo") private UserRepository userRepo; </code>
результаты в том же исключении. Единственное, что работает в сочетании с@Stateful
использовать интерфейс в объявлении var:
<code>@Inject @Named("userRepo") private CachingRepository userRepo; </code>
Мне может понадобиться подкласс функциональность здесь, поэтому с помощьюCachingRepository
не очень желательно (на данный момент).
Q's:
Why isn't this working as expected? TheUserRepository
var should already identify which class to instantiate, shouldn't it? What's the logic to this?
Why does the @Stateful
EJB annotation have such severe effects here? Why does it essentially force me into using the CachingRepository
interface in the var declaration?
NoteЯ & используя шов 3 лица, делая@ViewScoped
стать компонентом видимости CDI, так что проблема, вероятно, все еще остаетсяCDI-only.