@RequestParam
是 Spring Framework 中的一个注解,用于从请求中获取参数值并将其绑定到方法的参数上。它通常用于处理 GET 或 POST 请求中的查询参数或表单参数。
以下是 @RequestParam
注解的一些详细介绍:
-
用法:
@RequestParam
注解可以用在方法的参数上,用于获取请求中的参数值。 -
参数名称匹配:默认情况下,
@RequestParam
会根据参数的名称来匹配请求中的参数名。例如,如果方法参数为String name
,则会尝试从请求中找到名为 "name" 的参数值。 -
指定参数名:可以使用
@RequestParam
注解的name
属性来显式指定请求参数的名称,这在方法参数名与请求参数名不匹配时很有用。@RequestMapping("/example") public String example(@RequestParam(name = "paramName") String value) { // ... }
-
必需参数:默认情况下,
@RequestParam
指定的参数是必需的,如果请求中缺少该参数,将会报错。可以使用required
属性来设置参数是否是必需的。@RequestMapping("/example") public String example(@RequestParam(required = false) String optionalValue) { // ... }
-
默认值:可以使用
defaultValue
属性来设置请求中参数的默认值。如果请求中没有该参数,将使用默认值。@RequestMapping("/example") public String example(@RequestParam(defaultValue = "default") String value) { // ... }
-
参数类型转换:Spring 会自动根据方法参数的类型进行类型转换。例如,如果请求中的参数是一个字符串,而方法参数是整数类型,Spring 将尝试将字符串转换为整数。
-
支持多个值:
@RequestParam
支持绑定多个值到数组或列表参数。@RequestMapping("/example") public String example(@RequestParam List<String> values) { // ... }
使用时需要特别注意,如果接受的是多个值到数组或列表参数,是需要使用@RequestParam注解来进行绑定参数,以下是出错问题代码
@DeleteMapping @ApiOperation("删除套餐") public Result<String> delete(List<Long> ids) { log.info("要删除的套餐id:{}", ids); return setmealService.deleteByIds(ids); }
java.lang.IllegalStateException: No primary or single unique constructor found for interface java.util.List at org.springframework.beans.BeanUtils.getResolvableConstructor(BeanUtils.java:267) ~[spring-beans-5.3.22.jar:5.3.22] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:219) ~[spring-web-5.3.22.jar:5.3.22] at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:85) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:147) ~[spring-web-5.3.22.jar:5.3.22] at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:122) ~[spring-web-5.3.22.jar:5.3.22] at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:179) ~[spring-web-5.3.22.jar:5.3.22] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:146) ~[spring-web-5.3.22.jar:5.3.22] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1070) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.22.jar:5.3.22] at org.springframework.web.servlet.FrameworkServlet.doDelete(FrameworkServlet.java:931) ~[spring-webmvc-5.3.22.jar:5.3.22] at javax.servlet.http.HttpServlet.service(HttpServlet.java:687) ~[tomcat-embed-core-9.0.65.jar:4.0.FR] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.22.jar:5.3.22]
在Spring MVC中处理请求时,控制器方法的参数需要从请求中获取数据。在这个代码的情况下,
delete
方法需要一个参数来接收要删除的套餐的ID列表。然而,Spring MVC 默认情况下会尝试将请求中的数据转换为方法参数所需的类型。在这个代码中,
delete
方法参数的类型是List<Long>
,表示一个长整型的列表。但是,当通过一个 URL 发送请求时,URL 中的参数会被解析为字符串。由于 Spring MVC 无法自动将字符串转换为List<Long>
类型,所以会发生上面的错误。为了让 Spring MVC 正确地将请求中的参数映射到方法参数,需要告诉它将这些参数作为请求参数处理。这就是
@RequestParam
注解的作用。通过在参数前面添加@RequestParam
注解,在方法签名中明确指定了该参数是一个请求参数。这样,Spring MVC 将会正确地将请求中的参数值转换为List<Long>
类型的对象,并传递给delete
方法。因此,通过在方法参数前面添加
@RequestParam
注解,为 Spring MVC 提供了明确的指示,告诉它将请求中的参数ids
转换为List<Long>
类型的对象,从而避免了类型转换错误。