Java 如何在正确初始化Springbean的情况下在struts中手动调用分派

Java 如何在正确初始化Springbean的情况下在struts中手动调用分派,java,spring,struts-1,Java,Spring,Struts 1,我正在开发一个应用程序,从后端自动执行一组长操作,这目前必须由用户完成 因此,我需要从我正在开发的程序的操作中调用操作中的相关分派方法 我正在发展的行动是 public class AutomatedAction extends DispatchAction{ public ActionForward create(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletRespons

我正在开发一个应用程序,从后端自动执行一组长操作,这目前必须由用户完成

因此,我需要从我正在开发的程序的操作中调用操作中的相关分派方法

我正在发展的行动是

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()方法中,有用于层映射的Springbean,如-

getSomeBD().doOperation();
使用手动方式可以很好地工作,但是当我检查bean的getter时,我在上面的代码中得到了一个NullPointerException-

getSomeBD()

有人能解释为什么会这样吗?正如我所知,SpringBean是在服务器启动时初始化的,所以为什么要向我抛出一个空指针?

正如Aleksandr M所提到的,我找到了答案。因为Springbean不会通过调用
newMyAction()
来注入,所以我必须从上下文中获取MyActionbean本身

因此,我所做的是将-
实现ApplicationContextAware
添加到
AutomatedAction
类中

public class AutomatedAction extends DispatchAction implements ApplicationContextAware{}
通过实现
ApplicationContextAware
我们可以覆盖其

public void设置ApplicationContext(ApplicationContext上下文)

方法并通过定义实例变量获取实例变量的应用程序上下文。然后我能够从上下文中获取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类(无更改)


您通过调用
new
->自己创建了
MyAction
,在这种情况下不会注入Springbeans。很好,您已经解决了这个问题。不过最好移动
getSomeBD().doOperation()到某个服务并注入该服务,而不是使用另一个操作。是的,我同意。谢谢@Aleksandr M
public class MyAction extends DispatchAction{

    public ActionForward myDispatch(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{
        // Some code
        getSomeBD().doOperation();
    }
}