我正在开发一个应用程序,用于从后端自动执行一组长时间操作,目前这些操作必须由用户完成。
因此,我需要从我正在开发的程序的 Action 中调用 Actions 中的相关调度方法。
我正在开发的操作是
public class AutomatedAction extends DispatchAction{
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
MyAction myAction = new MyAction();
myAction.myDispatch();
// Want to call more dispatches like this
return null;
}
}
MyAction 类的示例是
public class MyAction extends DispatchAction{
public ActionForward myDispatch(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
// Some code
getSomeBD().doOperation();
}
}
但我面临的问题是在 myDispatch() 方法内部,有用于层映射的 Spring beans,例如 -
getSomeBD().doOperation();
这在手动方式下工作得很好,但是当我检查 bean 的 getter 时,我在上面的代码中得到了一个 NullPointerException -
getSomeBD()
谁能解释一下为什么会发生这种情况?据我所知,spring bean是在服务器启动时初始化的,所以为什么要给我一个NullPointer?
最佳答案
正如 Aleksandr M 所说,我找到了答案。因为 spring bean 不会通过调用 new MyAction() 来注入(inject),所以我必须从 Context 获取 MyAction bean 本身。
所以我所做的就是添加 - implements ApplicationContextAware
到 AutomatedAction
类。
public class AutomatedAction extends DispatchAction implements ApplicationContextAware{}
通过实现ApplicationContextAware
,我们可以覆盖它
public void setApplicationContext(ApplicationContext context);
方法并通过定义一个实例变量来获取应用程序上下文。然后我就能够从上下文中获取 bean,而不是创建一个新实例。
private ApplicationContext context;
public ApplicationContext getContext() {
return context;
}
public void setContext(ApplicationContext context) {
this.context = context;
}
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
this.context = context;
}
所以最终的编码如下所示。
AutomatedAction 类 -
public class AutomatedAction extends DispatchAction implements ApplicationContextAware {
private ApplicationContext context;
public ApplicationContext getContext() {
return context;
}
public void setContext(ApplicationContext context) {
this.context = context;
}
public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
MyAction myAction = (MyAction) getContext().getBean("/MyActionBean");
myAction.myDispatch();
// do more
return null;
}
}
MyAction 类(无更改)
public class MyAction extends DispatchAction{
public ActionForward myDispatch(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
// Some code
getSomeBD().doOperation();
}
}
关于java - 如何在正确初始化 Spring beans 的情况下手动调用 struts 中的调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44516643/