[英]@RequestParam array mapping issues
我正在使用Spring MVC框架進行REST服務。
我有一個方法:
@RequestMapping("/rest/{tableName}", method = RequestMethod.GET)
public @ResponseBody CustomObject query(
@PathVariable("tableName") String tableName,
@RequestParam(value="columns", required=false) String[] columns,
@RequestParam(value="filter", required=false) String[][] filters) {
...
}
好吧,我希望過濾器成為具有特定結構的二維數組:
如果我使用此網址/rest/table?filter=filter1,filter2&filter=filter3
發出請求,請執行以下操作: /rest/table?filter=filter1,filter2&filter=filter3
然后,我的filters = {{filter1, filter2}, {filter3}}
如果我這樣做: /rest/table?filter=filter1&filter=filter2
我有: filters = {{filter1},{filter2}}
我的問題是
為什么調用: /rest/table?filter=filter1,filter2
我得到: filters = {{filter1},{filter2}}
而不是: filters = {{filter1,filter2}}
?
在這種情況下,有什么方法可以獲取最后一個數組而不是第一個數組?
在URL中發送項目列表非常棘手。 一般來說,要求
/rest/table?filter=A&filter=B
和
/rest/table?filter=A,B
都將被解析,就好像A和B是單獨的參數一樣。 這是因為將Spring的默認WebDataBinder
配置為在逗號上拆分參數列表。 您可以通過向控制器添加一些綁定程序初始化代碼來禁用此默認配置。
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(
String[].class,
new StringArrayPropertyEditor(null));
}
現在,通過HTTP傳入的參數列表的數據綁定過程將不會在逗號上拆分, 而是被解釋為單獨的項。 這很可能會產生您要尋找的行為,因此以逗號分隔的參數列表將被視為單個數組參數,而不是N個單獨的單項數組參數。
為了替代使用逗號分隔符與管道,我不僅執行了以下操作:
1-創建了一個擴展PropertyEditorSupport的類,將分隔符設置為管道。
public class StringListPropertyEditor extends PropertyEditorSupport {
public static final String DEFAULT_SEPARATOR = "\\|";
@Override
public void setAsText(String text) throws IllegalArgumentException {
List<String> theList = Arrays.asList(text.split(DEFAULT_SEPARATOR));
setValue(theList);
}
}
2-在我的控制器上創建了一個InitBinder,將我的PropertyEditor注冊為CustomEditor
@InitBinder
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(List.class, new StringListPropertyEditor());
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.