2015-04-27 1 views
3

Я хочу использовать jquery, который может использоваться в моем проекте. Я могу удалять запрос ajax и получать ответ json для отображения данных в таблице. Но для использования поиска и сортировки на стороне сервера мне нужно принять параметры запроса, отправленные с помощью datatable. Параметры запроса приведены в следующей форме:Обработка параметров запроса таблицы данных в запросе весны

draw:1 
columns[0][data]:firstName 
columns[0][name]: 
columns[0][searchable]:true 
columns[0][orderable]:true 
columns[0][search][value]: 
columns[0][search][regex]:false 
columns[1][data]:lastName 
columns[1][name]: 
columns[1][searchable]:true 
columns[1][orderable]:true 
columns[1][search][value]: 
columns[1][search][regex]:false 
columns[2][data]:age 
columns[2][name]: 
columns[2][searchable]:true 
columns[2][orderable]:true 
columns[2][search][value]: 
columns[2][search][regex]:false 
order[0][column]:0 
order[0][dir]:asc 
start:0 
length:10 
search[value]: 
search[regex]:false 

Я хочу создать объект DTO для принятия таких параметров запроса. Я создал следующий DTO.

public class DataTableRequestDTO { 

    private int draw; 
    private List<HashMap<String, String>> columns; 
    private List<HashMap<String, String>> order; 
    private int start; 
    private int length; 

    public int getDraw() { 
     return draw; 
    } 
    public void setDraw(int draw) { 
     this.draw = draw; 
    } 
    public List<HashMap<String, String>> getColumns() { 
     return columns; 
    } 
    public void setColumns(List<HashMap<String, String>> columns) { 
     this.columns = columns; 
    } 
    public List<HashMap<String, String>> getOrder() { 
     return order; 
    } 
    public void setOrder(List<HashMap<String, String>> order) { 
     this.order = order; 
    } 
    public int getStart() { 
     return start; 
    } 
    public void setStart(int start) { 
     this.start = start; 
    } 
    public int getLength() { 
     return length; 
    } 
    public void setLength(int length) { 
     this.length = length; 
    } 

} 

Но когда я попал в АЯКС URL я получаю ошибки при слежении

org.springframework.beans.InvalidPropertyException: Invalid property 'columns[0][search][regex]' of bean class [demo.objects.DataTableRequestDTO]: Property referenced in indexed property path 'columns[0][search][regex]' is neither an array nor a List nor a Map; returned value was [false] 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1058) 
    at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:927) 
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:95) 
    at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:749) 
    at org.springframework.validation.DataBinder.doBind(DataBinder.java:645) 
    at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:189) 
    at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:106) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.bindRequestParameters(ServletModelAttributeMethodProcessor.java:150) 
    at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:110) 
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:77) 
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:162) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:129) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
    at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Строка не является действительным типом данных для обработки столбцы [0] [Поиск] [регулярное выражение]. Как обращаться с таким запросом в объекте DTO.

Благодаря

+0

См. Мой ответ здесь http://stackoverflow.com/questions/23704352/cant-map-a-query-string-parameters-to-my-javabean-using-spring-4-and-datatable/38834908#38834908 для приятного элегантного решения –

ответ

5

Я нашел ответ на this пост. Я добавил

$('#myTable').DataTable({ 
    serverSide: true, 
    ajax: { 
     "url": "url", 
     "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); 
    } 
} 

В JavaScript и конвертацию

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

в

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

Теперь я могу обрабатывать эти объекты запроса как

public class DataTableRequestDTO { 

    private int draw; 
    private List<HashMap<String, String>> columns; 
    private List<HashMap<String, String>> order; 
    private int start; 
    private int length; 

    public int getDraw() { 
     return draw; 
    } 
    public void setDraw(int draw) { 
     this.draw = draw; 
    } 
    public List<HashMap<String, String>> getColumns() { 
     return columns; 
    } 
    public void setColumns(List<HashMap<String, String>> columns) { 
     this.columns = columns; 
    } 
    public List<HashMap<String, String>> getOrder() { 
     return order; 
    } 
    public void setOrder(List<HashMap<String, String>> order) { 
     this.order = order; 
    } 
    public int getStart() { 
     return start; 
    } 
    public void setStart(int start) { 
     this.start = start; 
    } 
    public int getLength() { 
     return length; 
    } 
    public void setLength(int length) { 
     this.length = length; 
    } 
} 

Спасибо всем ..

+1

Спасибо за решение решетки. Единственное, что я добавлю, это способ, которым должен выглядеть метод springMVC: DataTableRequestDTO должен быть входным методом в контроллере и НЕ должен быть аннотирован с помощью @RequestParam – Hossein

 Смежные вопросы

  • Нет связанных вопросов^_^