gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:40:03 28 4
gpt4 key购买 nike

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

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com