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();
}
}