AspectJ和Wicket为Injector抛出nullpointer

时间:2012-10-25 14:00:20

标签: hibernate wicket aspectj

我有wicket aspectj应用程序,它使用hibernate带注释的类并使用DAO服务层。

我开发了一个不在applicationcontext中运行的updatetask。因此,我创建了一个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保存一些数据。

我有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),这会导致异常,告诉我在应用程序上执行init(Apllication.init())
    1. 试错法解决方案
  2. 我知道这似乎不是我所尝试的,但我现在真的没有选择:S

1 个答案:

答案 0 :(得分: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();
}