2015-10-26 6 views
0

Я новичок в 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 также никогда не вызывался.

Так вы можете мне помочь? Каков правильный подход для ввода текущего контекста (сеанса) в мои классы обслуживания?

Спасибо! :-)

ответ

1

Итак, я нашел решение самостоятельно! :-)

Я комментирую классы обслуживания как @ApplicationScoped и прикладываю все, что мне нужно. Car-Class использует сервис, но сам он не является. Для этого я использую DeltaSpike для инъекций, когда я instatiate объекта:

public Car() { 
    BeanProvider.injectFields(this); 
} 

Надеется, что я мог бы помочь кому-то в будущем! :-)

+0

Вы пропустите ссылку «this» в конструкторе. Не. Могут произойти многие тонкие ужасные вещи. И включение экземпляров CDI bean в качестве атрибутов управляемого компонента, отличного от CDI, вызовет проблемы, утечка памяти приходит в голову как первая. Сказал, что здесь может быть фундаментальный недостаток дизайна. С другой стороны, если Car должен быть компонентом CDI, просто используйте инъекцию конструктора. – jpangamarca

 Смежные вопросы

  • Нет связанных вопросов^_^