2017-06-13 87 views
1

我正在开发一个应用程序,以便从后端自动执行一组长操作,目前必须由用户完成。如何手动调用struts中的调度,弹簧豆已正确初始化

所以我需要从我正在开发的程序的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()方法,也有春豆用于图层映射,就像 -

getSomeBD().doOperation(); 

它可以正常使用手动方式,但我刚开始摹与当我检查bean的吸气上面的代码一个NullPointerException -

getSomeBD() 

谁能解释为什么出现这种情况?据我所知,spring bean在服务器启动时被初始化,那么为什么要抛出一个NullPointer?

+1

你正在创建'致电MyAction'自己'new' - >春豆将不会在此注入案件。 –

回答

1

正如Aleksandr M提到的,我找到了答案。因为Spring beans不会通过调用new MyAction()注入,所以我必须从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(); 
    } 
} 
+0

你已经解决了这个问题。最好将'getSomeBD()。doOperation();'移动到某个服务并注入该服务,而不是使用其他操作。 –

+0

是的,我同意。谢谢@Aleksandr M –