2017-06-13 68 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 –