Доступ к БД через JPA в Wicket IResource?
Я хочу реализовать DynamicImageResource
который будет установлен в приложении Wicket 6.7/Spring 3.2/JPA 2. это DynamicImageResource
должен извлечь информацию на основе входных параметров и создать ответ.
Вопрос: как я могу получить доступ к БД изнутри DynamicImageResource.getImageData(...)
? Я не могу ввести @PersistenceContextenter code here
или DAO через @SpringBean
, Моим последним средством будет статический PersistenceContextFactory.
Есть идеи получше? Или лучшие практики?
2 ответа
Так как Wicket управляет созданием компонентов для вас, или вы вручную создаете объекты с помощью их соответствующих конструкторов, механизмы внедрения не могут работать из коробки (объект, при вызове конструктора вручную, не управляется вашим контейнером).
Wicket предоставляет встроенную инъекцию для Компонента через наследование, волшебство позади - вызов Wicket componentInstanciationListeners
, Для каждого неуправляемого класса, не унаследованного от включенного внедрения, вы должны вручную инициировать инъекцию вашего компонента.
Как указано в комментарии, вы должны позвонить Injector.get().inject(this);
в вашем конструкторе, чтобы он работал.
Чтобы завершить все это, я пройду мимо PersistenceContextBridge
Весенняя фасоль здесь. Оборачивает EntityManager
, который будет введен через @PersistenceContext
, Используя аннотацию Lombok @Delegate
все вызовы бина будут переданы EntityManager
,
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import lombok.Delegate;
import org.springframework.stereotype.Service;
@Service
public class EntityManagerBridge implements EntityManager {
@Delegate
@PersistenceContext
private EntityManager em;
}
Теперь все, что мне нужно сделать в моем компоненте Wicket - это ввести EntityManagerBridge
как @SpringBean
:
@SpringBean
private EntityManager em; // inject EntityManagerBridge (implements EntityManager)
public MyFancyResource() {
Injector.get().inject(this); // enable Spring injection for
}