Я новичок в CDI и надеюсь, что кто-то может мне помочь.Имитировать CDI-компоненты динамически или вводить в не-cdi-beans
Ну, позвольте мне объяснить проблему:
Я реализовал основной компонент, который вызывается JSF EL. Этот компонент обрабатывает список объектов. Представьте себе что-то вроде List<Car>
. Эти объекты автомобиля построены в методе @PostMethod основного компонента.
Кроме того, у меня есть несколько классов обслуживания, например. CarServices, который обеспечивает что-то вроде public static List<Car> getCarsOfBrand(Session session, Brand brand)
. Внутри классов обслуживания сеанс Hibernate используется для запуска запроса и возврата заслуживающего списка.
Итак, ну ... Я хотел избавиться от передачи объекта сеанса. Таким образом, мой план заключался в том, чтобы ввести его. Я создал SessionScoped bean "PersistenceUnit" (возможно, это имя уже предварительно выделено, извините за это ...) с помощью метода public Session getCurrentSession()
. Я просто хочу ввести этот компонент во все мои классы обслуживания, чтобы просто называть что-то вроде getCarsOfBrand(Brand brand)
. Проблема в том, что я не могу вставлять CDI beans в не-beans. (Автомобиль в настоящее время просто POJO). Я попытался справиться с этим, объявив автомобиль бин CDI, добавив @SessionScoped. Но следующая проблема заключалась в том, что объекты Car были созданы мной, а не Контейнером. Я пытался что-то вроде
@Produces
public Car createCar() {
return new Car();
}
Но это также не увенчались успехом: я думал, что это аннотированный метод возвращает прокси автомобиля. Но ничего не случилось. Введенное поле внутри автомобиля все еще было нулевым, и его метод @PostConstruct также никогда не вызывался.
Так вы можете мне помочь? Каков правильный подход для ввода текущего контекста (сеанса) в мои классы обслуживания?
Спасибо! :-)
Вы пропустите ссылку «this» в конструкторе. Не. Могут произойти многие тонкие ужасные вещи. И включение экземпляров CDI bean в качестве атрибутов управляемого компонента, отличного от CDI, вызовет проблемы, утечка памяти приходит в голову как первая. Сказал, что здесь может быть фундаментальный недостаток дизайна. С другой стороны, если Car должен быть компонентом CDI, просто используйте инъекцию конструктора. – jpangamarca