无法将查询字符串参数映射到我的JavaBean(使用Spring 4和Datatables)
问题内容:
我真的很想在这里将QueryString参数映射到我的Spring JavaBean Command对象中,到目前为止,我找不到我的问题的答案。
我正在将jQuery Datatables插件与服务器端处理一起使用,以便数据表中的每个操作都触发对Spring应用程序的AJAX请求。
这是Datatable插件发送到我的Rest服务的参数:
http://localhost:8080/relatorios/produtos-source?draw=2&columns[0][data]=nome&columns[0][name]=&columns[0][searchable]=true&columns[0][orderable]=true&columns[0][search][value]=&columns[0][search][regex]=false&columns[1][data]=nomesAlternativos&columns[1][name]=&columns[1][searchable]=true&columns[1][orderable]=true&columns[1][search][value]=&columns[1][search][regex]=false&order[0][column]=2&order[0][dir]=asc&start=0&length=10&search[value]=ss&search[regex]=false&_=1400248561282
这就是我在Spring Controller中收到它的方式:
@RequestMapping(value = "/produtos-source", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ProdutoTable dataTableRequest(@ModelAttribute DataTableCriterias criterias) {
...
}
最后,这是我的DataTableCriterias JavaBean(由@ModelAttribute表示):
public class DataTableCriterias {
private int draw;
private int start;
private int length;
private Map<SearchCriterias, String> search;
private List<Map<OrderCriterias, String>> order;
private List<Column> columns;
public enum SearchCriterias {
value,
regex
}
public enum OrderCriterias {
column,
dir
}
public class Column {
private String data;
private String name;
private boolean searchable;
private boolean orderable;
private Map<SearchCriterias, String> search;
}
}
(省略/设置员)
这几乎完美地工作!如果我删除此行:
private List<Column> columns;
然后Spring从查询字符串中自动填充我的DataTableCriterias bean(但是,我当然没有映射columns属性)
但是添加此行后,出现此错误:
2014-05-16 17:20:16.605 ERROR 2368 --- [tomcat-http--99] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/relatorios] threw exception [Request processing failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property 'columns[0][data]' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Illegal attempt to get property 'columns' threw exception; nested exception is org.springframework.beans.NullValueInNestedPathException: Invalid property 'columns' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Could not instantiate property type [com.bergermobile.rest.domain.DataTableCriterias$Column] to auto-grow nested property path: java.lang.InstantiationException: com.bergermobile.rest.domain.DataTableCriterias$Column] with root cause
org.springframework.beans.NullValueInNestedPathException: Invalid property 'columns' of bean class [com.bergermobile.rest.domain.DataTableCriterias]: Could not instantiate property type [com.bergermobile.rest.domain.DataTableCriterias$Column] to auto-grow nested property path: java.lang.InstantiationException: com.bergermobile.rest.domain.DataTableCriterias$Column
at org.springframework.beans.BeanWrapperImpl.newValue(BeanWrapperImpl.java:651)
如我所见,主要问题是Datatable插件发送的’column’参数是一个二维数组,有时也是一个三维数组:
columns[0][data]=nome
columns[0][search][regex]=false
因此,看来我的Bean是正确的,但出现此错误,现在我被卡住了。
有任何想法吗?
非常感谢!
问题答案:
好的,因此我通过稍微修改发送到服务器的参数将两个3D列数组转换为2D数组来解决此问题。所以:
columns[0][search][value]=myvalue
columns[0][search][regex]=false
最终是:
columns[0][searchValue]=myvalue
columns[0][searchRegex]=false
这是在Databables中执行的操作:
$('#produtosTable').DataTable({
serverSide: true,
ajax: {
"url": "produtos-source",
"data": function(data) {
planify(data);
}
}
});
function planify(data) {
for (var i = 0; i < data.columns.length; i++) {
column = data.columns[i];
column.searchRegex = column.search.regex;
column.searchValue = column.search.value;
delete(column.search);
}
}
这样,我可以使用以下字段在模型对象中接收这些属性:
private List<Map<ColumnCriterias, String>> columns;
仅供参考,这是我的控制器:
@RequestMapping(value = "/produtos-source", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ProdutoTable dataTableRequest(@ModelAttribute DataTableCriterias criterias) {
ProdutoTable produtoTable = produtosService.findProdutos();
produtoTable.setDraw(criterias.getDraw());
return produtoTable;
}
这是我的DataTableCriterias @ModelAttriute的最终版本:
public class DataTableCriterias {
private int draw;
private int start;
private int length;
private Map<SearchCriterias, String> search;
private List<Map<ColumnCriterias, String>> columns;
private List<Map<OrderCriterias, String>> order;
public enum SearchCriterias {
value,
regex
}
public enum OrderCriterias {
column,
dir
}
public enum ColumnCriterias {
data,
name,
searchable,
orderable,
searchValue,
searchRegex
}
(省略/设置)