1

我有使用休眠注释类并使用 DAO 服务层的 wicket aspectj 应用程序。

我开发了一个不在应用程序上下文中运行的更新任务。因此,我创建了一个 main 方法并将上下文加载为全局变量。

public static void main(String[] args) throws Exception
{
    context = new ClassPathXmlApplicationContext(LOCATIONS);
    XS2RAWebApp webApp = new XS2RAWebApp() {
        @Override
        public void init() {
            getComponentInstantiationListeners().add(new SpringComponentInjector(this, context,true));
        }
    };
    ThreadContext.setApplication(webApp);
    ResponseUpdateTask updatetask = new ResponseUpdateTask();

    updatetask.run();
}

如您所见,SpringComponentInjector 提供了一个 springcomponent 注入器。

在这个更新任务中,我想用休眠保存一些数据。

我有 Hibernate 实体,在这个实体中我有对我的服务 DAO 的引用。

@MappedSuperclass()
public abstract class Entiteit {
    private static final Logger log = LoggerFactory.getLogger(Entiteit.class);

    @SpringBean()
    @Transient
    private transient DataAccessHelper daoHelper;
    ...
    public DataAccessHelper getDaoHelper() {
    if (daoHelper== null) {
        Injector.get().inject(daoHelper);
    }
    return daoHelper;
  }
}

我尝试过的事情

  1. 只需使用 Mockapplication 并添加新的新 SpringComponentInjector(this, context,true),这会导致异常告诉我对应用程序进行初始化 (Allication.init())
    1. 试错解决方案

我知道我尝试过的似乎并不多,但我现在真的没有选择:S

4

1 回答 1

2

您需要注册一个应用程序,该应用程序具有指向 ServetContext 和 WicketFilter 的链接。这可以通过编程方式完成:

public static void main(String[] args) throws Exception
{
    context = new ClassPathXmlApplicationContext(LOCATIONS);
    XS2RAWebApp webApp = new XS2RAWebApp() {
        @Override
        public void init() {
            getComponentInstantiationListeners().add(new SpringComponentInjector(this, context,true));
        }
    };
    ThreadContext.setApplication(webApp);
    webApp.setServletContext(new MockServletContext());
webApp.setWicketFilter(new WicketFilter(webApp));
webApp.initApplication();

    ResponseUpdateTask updatetask = new ResponseUpdateTask();
    updatetask.run();
}
于 2012-11-06T15:48:13.480 回答