2013-05-15 67 views
3

我的目標是如果由於請求參數爲空字符串而將其設置爲空,則操作屬性應爲null。從空字符串參數中設置操作屬性null

我創建了一個在默認堆棧之前運行的攔截器,它將invocation.getInvocationContext().getParameters()中的所有值修剪爲null。但是,這並沒有解決我的問題。儘管參數現在爲空(在使用ParameterAware的操作中進行了驗證),但屬性仍然被設置爲空字符串。

在進一步閱讀,我看到parameters interceptor可能的原因,特別是:

當正在調用該攔截器,一個標誌(ReflectionContextState#CREATE_NULL_OBJECTS)被導通,以確保任何空引用是自動創建 - 如果可能的話。有關更多信息,請參見類型轉換文檔和InstantiatingNullHandlerjavadocs。

是否有一些簡單的方法來實現我的目標?

如果情況變得更糟,似乎可以擴展ParametersInterceptor類,並覆蓋方法doIntercept(ActionInvocation invocation)setParameters(Object action, ValueStack stack, final Map<String, Object> parameters)。這似乎令人難以置信地尷尬,因爲我認爲,許多人會希望的行爲。

回答

2

我不認爲太多的人會真的希望這種行爲,因爲它基本上顛覆了正常的HTTP參數行爲,其中未填充的參數是一個空字符串。

您有幾個選項。您可以嘗試替換或擴展StrutsObjectFactory。您可以嘗試替換或擴展InstantiatingNullHandler。這兩個配置都在struts-default.xml中,應該很容易覆蓋。

但是,我可能採取了一種不同的方法,因爲您基本上都是要求解決HTTP問題,並且在註釋輸入爲空時應將其設置爲null的操作字段進行註釋。在「參數」之後運行的攔截器將根據操作的屬性和註釋檢查參數,並根據需要將它們清空。

這個想法有很多種變化,你可能只需要一個具有映射的動作,而「null」參數用一個映射條目表示。這樣可以避免註釋和方法查找(儘管可以在類名上緩存),但會犧牲一些額外的代碼。

+0

我已經採取了你的建議,我正在圍繞HTTP工作,並且改爲在傳遞空字符串時將表單字段上的setter設置爲null。 – Matt

+0

@Matt哦,不知何故,我甚至都沒想到 - 那太簡單了! –