2010-06-15 43 views
0

陣列對於一個簡單的動作類與這些成員變量:Struts2的轉換枚舉陣列填充單空值

... 
private TestConverterEnum test; 
private TestConverterEnum[] tests; 
private List<TestConverterEnum> tList; 
... 

和一個簡單枚舉:

public enum TestConverterEnum { 
    A, 
    B, 
    C; 
} 

使用默認struts2的枚舉轉換,當我發送這樣的請求:

TestConterter.action?test=&tests=&tList=&b=asdf 

對於test我得到一個null值,這是預期的。然而,對於數組和列表,我得到和數組(或列表)與一個空元素。這是預期的嗎?有沒有辦法來防止這一點。

我們最近升級了struts2的版本,我們有我們自己的轉換,這也不會在這種情況下工作,所以我希望能使用默認的轉換方法。我們已經有驗證這些數組的代碼,其長度爲null,我不想爲這些分支添加其他條件。有沒有辦法阻止這種行爲?

回答

2

是的,它預計行爲國際海事組織。因此,struts2參數攔截器要求(通過反射)接受數組的設置器或(作爲第二個選項)一個單一的值。這些參數在原理上是多值的(通常用在多值選擇列表中),因此struts2參數攔截器要求(通過反射)接受數組的設置器。你的行動很可能有一個setTests(TestConverterEnum[] a)制定者,所以,當Struts2的攔截器必須映射tests=他創立的是二傳,並認爲自己:「我必須設置這個‘測試’屬性與數組,讓我們看到許多參數如何傳遞.. 。只有一個(空),然後讓我們創建一個長度爲1的數組,然後用換算符填充它。「等。

我覺得它是合理的:您的請求包含'tests'參數(儘管爲空),因此創建了一個大小的數組。

我敢打賭,如果你試圖TestConterter.action?tests=&tests=長度爲2的陣列將被創建。

更新

讓我們看看如果我們同意這種說法:傳遞一個空參數的請求(原則上)一樣不及格吧...雖然經常一個人想將兩種情況視爲等同。

如果你想告訴Struts2:「完全忽略空參數」 ......我不認爲(假設這是一個可接受的想法),這種行爲可以通過一些全局設置強制執行。 你總是可以編寫自己的攔截器(或延長參數攔截器),因此它映射之前淘從請求空參數。

順便說一句,注意,這個問題是無關的枚舉或陣列,是完全通用。現在

,多值參數的情況下,需要額外考慮。我假設如果你的Action有一個數組類型的公共屬性,那是因爲它可以用幾個參數來設置,(通常是SELECT MULTIPLE) - 如果不是,這裏有一些設計問題。 現在,你對這個請求的預期行爲是什麼?

TestConterter.action?tests=&tests=A&tests=&tests=B&tests=B 

如果這產生長度的陣列5 [null, A, null, B, B]或3 [A, B, B]或2 [A, B]或什麼? 很難給出一般標準;這就是爲什麼在一般情況下更好地處理你的setter方法的原因。

+0

對我來說,這似乎很奇怪,因爲空的表單字段看起來很平常。這意味着爲了查看我是否具有有效值,我必須檢查每個數組:array!= null && array.length> 0 && //每個元素不爲null。 它只是看起來給我。有沒有辦法解決它? – partkyle 2010-06-15 20:46:30

+0

我更新了我的答案 – leonbloy 2010-06-15 21:02:07