SpringMVC框架前端传递List限制大小256问题

来源:互联网 发布:淘宝上高科技的小东西 编辑:程序博客网 时间:2024/04/30 15:37

SpringMVC前端传递List到后台限制256问题

     在做项目的时候,出现了一个问题,有个需求需要把前台长度很长的数组传递到后台进行保存,自己做的时候只是用了几十条数据进行测试,没啥问题,后面测试人员说当数据998条时报错了,数组下标越界
     错误信息
03/03 14:46:13 [INFO] WebCommonInterceptor:  >>>>>>> Finshed handling request[excel/getBatchSchoolListName]03/03 14:46:13 [ERROR] DispatcherServlet4App:  Invalid property 'riskSchoolList[256]' of bean class [common.dto.QuotationDTO]: Index of out of bounds in property path 'riskSchoolList[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256org.springframework.beans.InvalidPropertyException: Invalid property 'riskSchoolList[256]' of bean class [common.dto.QuotationDTO]: Index of out of bounds in property path 'riskSchoolList[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:833)        at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:576)        at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:553)        at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:914)        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)        at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)        at org.springframework.validation.DataBinder.doBind(DataBinder.java:588)        at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:191)        at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:112)        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind(AnnotationMethodHandlerAdapter.java:785)        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doBind(HandlerMethodInvoker.java:813)        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:367)        at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:171)        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:436)        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:424)        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)        at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:790)        at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)        at javax.servlet.http.HttpServlet.service(HttpServlet.java:821)        at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)        at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)        at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:301)        at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:27)        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:61)        at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:89)        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)        at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:61)        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3748)        at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3714)        at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)        at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)        at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2283)        at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2182)        at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1491)        at weblogic.work.ExecuteThread.execute(ExecuteThread.java:263)        at weblogic.work.ExecuteThread.run(ExecuteThread.java:221)Caused by: java.lang.IndexOutOfBoundsException: Index: 256, Size: 256        at java.util.ArrayList.RangeCheck(ArrayList.java:547)        at java.util.ArrayList.get(ArrayList.java:322)        at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:793)        at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:576)        at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:553)        at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:914)        at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:76)        at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:692)        at org.springframework.validation.DataBinder.doBind(DataBinder.java:589)        at org.springframework.web.bind.WebDataBinder.doBind(WebDataBinder.java:192)        at org.springframework.web.bind.ServletRequestDataBinder.bind(ServletRequestDataBinder.java:113)        at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.doBind
解决方案,在Action里重写SpringMVC限制的数组的方法:
    @InitBinder    public void initBinder(WebDataBinder binder) {        // 设置List的最大长度        binder.setAutoGrowCollectionLimit(10000);    }

这段代码我发现在项目在解决框架缺陷的时候已经在baseAction里重写了这个方法,在其他Action里是继承了baseAction,在开发环境里测试时没有问题的,但在测试环境里就不生效了,最后想到了两个解决方案,
  1.直接在自己的Action在去重写上面的方法 
  2.在前台把数组转换成Json串,传到后台把Json串转换成集合
方案一:其实上面的那段代码写在baseAction里就是为了在其他的Action里不用重写了,但是在测试环境不生效,很郁闷,只有先这样子了
方案二: JSON.stringifier(myObject); 但传到后台是报错,应为存在特殊字符
方案三:开发环境可以,测试环境不可以,会不会是其他问题,于是又让部署人员清除下部署包缓存,但是还是没用,可能就是两个环境存在差异吧
最后还是用方案一解决的,因为时间比较紧,项目快上线了,而且如果改成json串,改动点比较多,最后还是决定用方案一
以前都不知道这个问题,工作也是一个学习的过程

0 0
原创粉丝点击