在Wicket IResource中通过JPA访问数据库?

时间:2013-04-20 11:36:54

标签: spring hibernate wicket spring-orm wicket-1.6

我想实现一个DynamicImageResource,它将被安装在Wicket 6.7 / Spring 3.2 / JPA 2应用程序中。此DynamicImageResource将根据输入参数检索信息并创建响应。

问题是:如何从DynamicImageResource.getImageData(...)内访问数据库?我无法通过enter code here注入@PersistenceContext @SpringBean或DAO。我的最后一招是静态PersistenceContextFactory。

有更好的想法吗?还是最佳实践?

2 个答案:

答案 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
}