У меня есть некоторые DAO, например UserDAO, ProductDAO
и т. Д. Без аннотаций или отборочных cdi (это @Default
). Эти классы реализуют абстрактные DAO:Получить точный объект из инъецированного экземпляра CDI
public interface DAO {
void update();
void delete();
void getById(long id);
}
Так я получаю все имеющиеся реализации DAO:
public class ClassToInjectIn {
@Inject
private Instance<DAO> allDAOs;
}
Теперь allDAOs
содержит следующее:
[UserDAO, {@Default(), @Any()}]
[ProductDAO, {@Default(), @Any()}]
Например, мне нужно, чтобы получить UserDAO от этот случай, но я не могу. Я хочу сделать это так, как это:
UserDAO user = allDAOs.get();
Но он бросает исключение:
Исключение в потоке «главный» javax.enterprise.inject.AmbiguousResolutionException: Слишком много бобов матч, потому что все они имеют равный приоритет.
Так проблема в том, что я не могу использовать много классификаторов, потому что у меня есть много лиц, и они могут быть добавлены позже. Мне нужен один универсальный метод, который может найти и извлечь объект с запрошенным типом, как это было показано в примере выше. И он не должен использовать имя класса или любые имена строк для деинсталляции нужного типа или класса. Например. public DAO getNeededDAO(String neededClassName)
. Он должен динамически обнаруживать требуемый тип/класс. Можно ли это сделать?
UPDATE
мне нужно именно это:
UserDAO user = chooseAndGetRequiredDAO();
Так chooseAndGetRequiredDAO()
должен понимать, что требуется тип UserDAO. Он должен искать существующие DAO и выбирать UserDAO, если находит. Возможно, он должен использовать рефлеон или любую фабрику DAO, я не уверен.
Боже мой, все было так просто. Благодарю. – nllsdfx