无法将查询字符串参数映射到我的 JavaBean(使用 Spring 4 和数据表) [英] Can't map a Query String parameters to my JavaBean (using Spring 4 and Datatables)

查看:36
本文介绍了无法将查询字符串参数映射到我的 JavaBean(使用 Spring 4 和数据表)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我真的一直在尝试将我的 QueryString 参数映射到我的 Spring JavaBean Command 对象中,到目前为止我找不到我的问题的答案.

I'm really stuck into trying to map my QueryString parameters into my Spring JavaBean Command object here, and I couldn't find an answer to my question so far.

我正在使用带有 服务器端处理的 jQuery Datatables 插件,以便我的数据表中的每个操作, 触发对我的 Spring 应用程序的 AJAX 请求.

I'm using jQuery Datatables plugin with server side processing so that each action in my datatable, triggers an AJAX request to my Spring application.

这是 Datatable 插件发送到我的 Rest 服务的参数:

This is the parameters the Datatable plugin is sending to my Rest service:

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 中接收它的方式:

This is how I am receiving it in my Spring Controller:

@RequestMapping(value = "/produtos-source", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
@ResponseBody
public ProdutoTable dataTableRequest(@ModelAttribute DataTableCriterias criterias) {
    ...
}

最后,这是我的 DataTableCriterias JavaBean(由@ModelAttribute 指示):

And finally, this is my DataTableCriterias JavaBean (indicated by @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;
    }
}

(get/setters ommited)

这几乎完美无缺!如果我删除这一行:

This almost works perfectly! If I remove this line:

private List<Column> columns;

然后 Spring 会自动从查询字符串中填充我的 DataTableCriterias bean(但当然,我没有映射列属性)

then Spring automagically populates my DataTableCriterias bean from the query string (but of course, I don't get the columns property mapped)

但是添加此行后,我收到此错误:

But with this line added, I get this error:

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 插件发送的列"参数是二维数组,有时也是三维数组:

As I see it, the main problem is that the 'column' parameter sent by the Datatable plugin is a bidimensional and sometimes also a tridimensional array:

columns[0][data]=nome
columns[0][search][regex]=false

所以,看起来我的 Bean 是正确的,但我收到了这个错误,现在我卡住了.

So, it looks like my Bean was correct, but I get this error and now I'm stuck.

有什么想法吗?

非常感谢!

推荐答案

好的,所以我最终通过稍微修改发送到服务器的参数来解决这个问题,将两个 3D 列数组转换为一个 2D 数组.所以:

Ok, so I ended up fixing this issue with slightly modifying the parameters sent to the server, to transform the two 3D array of columns into a 2D array. So:

columns[0][search][value]=myvalue
columns[0][search][regex]=false

结果是:

columns[0][searchValue]=myvalue
columns[0][searchRegex]=false

这是如何在 Databables 中做到这一点:

This is how to do that in 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);
    }
}

这样我就可以使用这个字段在我的模型对象中接收这些属性:

This way I can receive those properties in my Model object using this field:

private List<Map<ColumnCriterias, String>> columns;

<小时>

仅供参考,这是我的控制器:


Just for reference, here is my Controller:

@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:

and here is final my 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
    }

(省略get/setters)

这篇关于无法将查询字符串参数映射到我的 JavaBean(使用 Spring 4 和数据表)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆