java - 如何在正确初始化 Spring beans 的情况下手动调用 struts 中的调度

标签 java spring struts-1

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

因此,我需要从我正在开发的程序的 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 ApplicationContextAwareAutomatedAction 类。

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/

相关文章:

java - 服务器压缩有效负载时出现 websocket 协议(protocol)错误

java - Spring AOP : Aspect not working on called method

java - 如何显示html :text using <logic:iterate> for List<String> in Struts1. 1

java - 如何设置登录页面路径

java - 获得两列的不同组合

java - 将java代码与浏览器集成

java - Spring(Hibernate)更新问题

javascript - 使用 STRUTS 禁用自动完成(自动完成 ="off")

java - 不支持的媒体类型”,"exception":"org.springframework.web.HttpMediaTypeNotSupportedException","message":"Content

java - 在 java 类中处理 JSP (Spring MVC)