spring-mvc限制前端传递list参数的长度为256

本文介绍了解决Spring MVC框架限制前端传递列表参数到后端的问题,通过调整DataBinder的默认设置,允许更大的列表长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接收前端数据时发生如下错误:

org.springframework.beans.InvalidPropertyException: Invalid property 'cpaCpafCpnNewList[256]' of bean class [com.ufgov.entity.CpaCpafChgAttach]: Index of out of bounds in property path 'cpaCpafCpnNewList[256]'; nested exception is java.lang.IndexOutOfBoundsException: Index: 256, Size: 256
	at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:832)
	at org.springframework.beans.BeanWrapperImpl.getNestedBeanWrapper(BeanWrapperImpl.java:571)
	at org.springframework.beans.BeanWrapperImpl.getBeanWrapperForPropertyPath(BeanWrapperImpl.java:548)
	at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:912)
	at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:82)
	at org.springframework.validation.DataBinder.applyPropertyValues(DataBinder.java:728)
	at org.springframework.validation.DataBinder.doBind(DataBinder.java:624)
	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:153)
	at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:108)
	at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:79)
	at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:157)
	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:124)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at com.ufgov.util.LoginFilter.doFilter(LoginFilter.java:126)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at com.ufgov.util.CharacterFilter.doFilter(CharacterFilter.java:34)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
	at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
	at java.lang.Thread.run(Thread.java:662)
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:791)
	... 51 more

一看到256这个数字,就知道肯定是框架作祟。。。。。。

不知道为什么框架要做这样的限制。如下是限制的源头

public class DataBinder implements PropertyEditorRegistry, TypeConverter {

	/** Default object name used for binding: "target" */
	public static final String DEFAULT_OBJECT_NAME = "target";

	/** Default limit for array and collection growing: 256 */
	public static final int DEFAULT_AUTO_GROW_COLLECTION_LIMIT = 256;



百度一下,解决办法如下

在controller中重写如下方法:

    /**
     * 解决spring-mvc限制前端传递list参数到后端时,限制长度256
     * @param binder
     */
    @InitBinder
    protected void initBinder(WebDataBinder binder) {
        binder.setAutoGrowNestedPaths(true);
        binder.setAutoGrowCollectionLimit(1024);
    }

当然,如果controller有继承其它base的话,统一处理更好


<think>好的,我现在需要解决用户的问题:在Spring MVC中如何正确接收List类型的参数。用户提到他们参考了几个引用资料,但可能还有一些疑问或需要更详细的指导。 首先,我需要回忆Spring MVC处理参数绑定的相关知识。根据引用[2],Spring MVC可以通过@RequestParam注解来接收参数,包括集合类型。引用[1]中提到使用@RequestParam("user")来接收User对象,而User类中包含List<Long> ids,这说明当参数是对象内的集合时,可以通过对象属性来接收。另外,引用[3]展示了直接在URL中传递参数的方法,比如通过路径参数或请求参数。 接下来,我需要确定几种常见的传递List类型参数的场景。通常,前端传递List参数的方式可能有以下几种: 1. 作为请求参数(query parameters),例如?ids=1&ids=2&ids=3。 2. 作为表单数据(form data),在POST请求中发送。 3. 作为JSON数据在请求体中传递(application/json)。 对于第一种情况,使用@RequestParam接收。例如: ```java @RequestParam("ids") List<Long> ids ``` 但需要注意,默认情况下,Spring MVC可能需要使用MultiValueMap或者数组,但根据引用[2],使用@RequestParam可以直接绑定到List,只要参数名一致。不过有时可能需要配置数据绑定器,比如在处理复杂类型时。 第二种情况,如果是表单提交,同样可以使用@RequestParam或者通过对象属性绑定。例如,如果有一个表单中的多个输入字段名称相同,Spring会自动将它们绑定到List。 第三种情况,当使用application/json时,需要使用@RequestBody注解,并配合一个POJO来接收。例如,引用[1]中的例子,User类中有List<Long> ids,前端发送JSON数据,后端用@RequestBody User user来接收。这里需要确保正确配置了消息转换器,比如Jackson,以处理JSON转换。 另外,用户可能遇到的问题是参数绑定失败,比如类型不匹配或格式错误。例如,如果前端传递的数组格式不正确,或者后端没有正确使用注解,就会导致接收不到参数。这时候需要检查请求的Content-Type是否正确,以及后端方法的注解是否匹配。 还需要注意,当使用GET请求传递List参数时,URL的长度限制可能导致问题,这时候可能需要改用POST请求。此外,在处理复杂嵌套的List集合时,可能需要自定义转换器或使用@ModelAttribute注解。 总结最佳实践: 1. 明确参数传递的方式(query参数、表单、JSON)。 2. 根据传递方式选择合适的注解(@RequestParam、@ModelAttribute、@RequestBody)。 3. 确保前端参数名称与后端接收名称一致。 4. 配置正确的消息转换器(如Jackson)以处理JSON数据。 5. 处理可能的异常情况,比如空列表或类型错误。 最后,生成相关问题时要覆盖用户可能进一步关心的内容,比如参数绑定异常处理、前端如何传递数组、不同Content-Type的影响等。</think>在Spring MVC中接收List类型参数需要根据参数传递方式选择对应的处理方式,以下是三种常见场景的最佳实践: ### 一、URL请求参数接收List 适用于通过`?ids=1&ids=2&ids=3`形式传递参数: ```java @GetMapping("/simple-list") public String simpleList(@RequestParam("ids") List<Long> ids) { return "Received: " + ids; } ``` *关键点:参数名需保持一致,Spring会自动绑定到List* ### 二、表单数据接收List 适用于表单提交或`x-www-form-urlencoded`格式: ```html <!-- 前端表单示例 --> <form action="/param/list-form" method="post"> <input type="text" name="users[0].id" value="1"> <input type="text" name="users[1].id" value="2"> </form> ``` ```java @PostMapping("/list-form") public String formList(@ModelAttribute FormWrapper wrapper) { return "Processed: " + wrapper.getUsers(); } // 包装类定义 public class FormWrapper { private List<User> users; // getters/setters } ``` ### 三、JSON数据接收List(推荐方式) 适用于`application/json`格式的复杂数据结构: ```java @PostMapping("/json-list") public String jsonList(@RequestBody List<User> users) { return "Processed: " + users.size() + " items"; } ``` *需要配置消息转换器:* ```xml <!-- pom.xml 添加Jackson依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.12.3</version> </dependency> ``` ### 四、常见问题解决方案 1. **类型转换异常**: - 添加自定义转换器处理特殊格式 - 使用`@DateTimeFormat`等注解规范格式 2. **空值处理**: ```java @RequestParam(required = false) List<String> tags ``` 3. **嵌套集合接收**: ```java public class Department { private List<Employee> staff; } ``` ### 五、性能优化建议 - 对大型数据集(超过1000条)建议分页处理 - 使用DTO对象进行数据校验: ```java @Valid @RequestBody UserListDTO dto ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值