我想实现一个DynamicImageResource
,它将被安装在Wicket 6.7 / Spring 3.2 / JPA 2应用程序中。此DynamicImageResource
将根据输入参数检索信息并创建响应。
问题是:如何从DynamicImageResource.getImageData(...)
内访问数据库?我无法通过enter code here
注入@PersistenceContext @SpringBean
或DAO。我的最后一招是静态PersistenceContextFactory。
有更好的想法吗?还是最佳实践?
答案 0 :(得分:4)
由于Wicket为您管理组件实例化,或者您通过各自的构造函数手动实例化对象,注入机制无法开箱即用(对象是按照手动构造函数调用,不受容器管理)。 / p>
Wicket通过继承为Component提供内置注入,其背后的魔力是Wicket调用componentInstanciationListeners
。对于每个未从注入启用的类继承的非托管类,您必须手动触发对bean的注入。
如评论中所述,您应该在构造函数中调用Injector.get().inject(this);
以使其正常工作。
答案 1 :(得分:1)
为了完成整个过程,我将在这里通过我的PersistenceContextBridge
Spring bean。它包裹EntityManager
,它将通过@PersistenceContext
注入。通过使用Lombok注释@Delegate
,对bean的所有调用都将委派给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
}