2012-04-27 69 views
0

我試圖確保當一個動作被調用時,給出了期望的參數(如顯示用戶配置文件我想確保參數包含用戶ID:viewUser.action?userId = 1 should工作很好,但viewUser.action應該重定向到一個錯誤頁面)struts2準備和驗證

所以我創建了一個驗證xml,指定userId字段不能爲空。一切正常。

但現在,在prepare()上,我使用userId做了一些前期工作。 事實上,在驗證攔截器之前調用準備攔截器,所以如果userId爲null,那麼我有一個很好的nullPointerException,並且不會調用驗證,因爲之前發生錯誤。 我知道我可以切換攔截器的順序,但我不想。

所以我的問題是: 我是否應該使用prepare()方法中的參數?有沒有其他方法可以解決這個問題?

感謝和抱歉,我的英語不好:(

回答

1

使用「paramsPrepareParamsStack」攔截器堆棧。

+0

所以我會有params => prepare => params =>驗證。但是如果idUser爲空,我仍然會在使用idUser時遇到問題。 – Estragon 2012-04-27 09:30:11

+0

@Estragon你不能檢查它是否爲空?或者你使用它的業務邏輯沒有做任何理智檢查? – 2012-04-27 10:06:58

+0

當然,我檢查所有的輸入,但我不相信準備是檢查的地方,驗證系統應該更好,手動檢查準備/業務功能...另外我真的不知道如何反應,如果參數爲null準備 – Estragon 2012-04-27 10:09:41

0

你可以改變你的struts-default.xml中的文件的攔截器默認順序,所以複選框,而params攔截器會開始前準備攔截。

<interceptor-stack name="basicStack"> 
    <interceptor-ref name="exception"/> 
    <interceptor-ref name="servletConfig"/> 
    <interceptor-ref name="checkbox"/> 
    <interceptor-ref name="params"/> 
    <interceptor-ref name="prepare"/> 
    <interceptor-ref name="conversionError"/> 
</interceptor-stack> 

但我不喜歡這個主意。我的事情更好的辦法是改變你的行動邏輯和,如果他們使用的一些參數準備功能刪除代碼的所有部分。爲什麼你做的它在「準備」?你想在驗證過程中使用結果?

+0

'prepareParamsPrepareStack'已經存在用於此目的;爲什麼要自己做?除此之外,OP已經表明,切換攔截器命令不管出於什麼原因都是不可取的。 – 2012-04-27 10:14:53

+0

啊,你的意思是paramsPrepareParamsStack?是的,這是更好的解決方案。 – 2012-04-27 10:43:12

+0

哎呀,是的 - 讓他們倒退了,我必須在30分鐘內忘記了;) – 2012-04-27 10:44:01

0

接下來是關於如何避免這個問題的解釋,並簡化了所有的開發過程,但最直接的解決方案當然是Daves。我肯定會首先實現這一點,並在未來使用該問題。

根據我的經驗,prepare()用於獲取服務,這會讓動作完成它的工作,最好由依賴注入(Spring)提供服務。

一般動作類負責以下:

  • 要執行的操作(服務對象)需要獲取的對象。
  • 獲取執行操作所需的參數(由服務對象用來獲取我們需要的參數)。
  • 驗證參數是有意義的(驗證方法/註釋,可以外部化爲xml)。
  • 執行操作(使用前面提到的服務對象)。
  • 獲取所需視圖中的對象...

這你知道,你也知道,準備是關於讓有些人雖然不喜歡的東西打開了要執行的操作(理想情況下的服務對象所需的對象DB連接)。實際的做法應該僅限於執行方法。

與理想的路線一樣,使用注入您選擇的DI提供者(Spring/Guice)的服務對象,我們發現自己幾乎沒有理由需要準備方法。我們的行動變得更小,更容易理解,因此更容易進行測試。