Неудовлетворенные зависимости для типа […] с квалификаторами [@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? The UserRepository 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.

Ответы на вопрос(1)

Ваш ответ на вопрос