#jsf-2 #glassfish #cdi
#jsf-2 #glassfish #cdi
Вопрос:
Я искал здесь об этом, но не нашел ответа.
В моем приложении у меня есть абстрактный основной класс для моих контроллеров с некоторыми методами и свойствами. И я хочу ввести DAO автоматически.
abstract class AbstractController<E extends AbstractEntity, D extends AbstractDAO<E>> {
@Inject
private D dao;
// getters and setters
}
abstract class AbstractDAO<E extends AbstractEntity> {
@PersistentContext
private EntityManager em;
// finds returns E
}
// implemenation/usage
class CarController extends AbstractController<Car, CarDAO> {
}
Получение исключения:
org.jboss.weld.exceptions.DefinitionException: WELD-001407 Cannot declare an injection point with a type variable: [field] @Inject private AbstractController.dao
Использование: Glassfish 3.1 и JSF 2.1.
Есть ли обходной путь или альтернатива для этого?
Спасибо.
Комментарии:
1. Является
D
ли EJB (управляемым компонентом)?2. Используя компоненты, управляемые сеансом EJB (без состояния или с сохранением состояния), я могу получить экземпляр, используя InitialContext.lookup в методе get. Но я хочу использовать инъекцию типа @Dependent. У тебя есть для меня идея получше?
3. Guice способен справиться с подобными вещами.
4. Теперь я использую эти DAO в качестве сеансового компонента с отслеживанием состояния и получаю экземпляр с помощью контекстного поиска.
Ответ №1:
Для отражения технически очень сложно определить правильный тип среды выполнения с помощью универсального объявления в исходном коде и привести его к нему. Weld просто не поддерживает и не будет поддерживать его.
Лучше заявите об этом против AbstractDAO<E>
:
private AbstractDAO<E> dao;
В любом случае, вы ничего не выиграете, заявив об этом против D
.
Комментарии:
1. Могу ли я с помощью Weld получить экземпляр с помощью lookup/newInstance/ … по имени класса?