@RequestParam注解的详细介绍

@RequestParam 是 Spring Framework 中的一个注解,用于从请求中获取参数值并将其绑定到方法的参数上。它通常用于处理 GET 或 POST 请求中的查询参数或表单参数。

以下是 @RequestParam 注解的一些详细介绍:

  1. 用法@RequestParam 注解可以用在方法的参数上,用于获取请求中的参数值。

  2. 参数名称匹配:默认情况下,@RequestParam 会根据参数的名称来匹配请求中的参数名。例如,如果方法参数为 String name,则会尝试从请求中找到名为 "name" 的参数值。

  3. 指定参数名:可以使用 @RequestParam 注解的 name 属性来显式指定请求参数的名称,这在方法参数名与请求参数名不匹配时很有用。

    @RequestMapping("/example") public String example(@RequestParam(name = "paramName") String value) { // ... }
  4. 必需参数:默认情况下,@RequestParam 指定的参数是必需的,如果请求中缺少该参数,将会报错。可以使用 required 属性来设置参数是否是必需的。

    @RequestMapping("/example") public String example(@RequestParam(required = false) String optionalValue) { // ... }
  5. 默认值:可以使用 defaultValue 属性来设置请求中参数的默认值。如果请求中没有该参数,将使用默认值。

    @RequestMapping("/example") public String example(@RequestParam(defaultValue = "default") String value) { // ... }
  6. 参数类型转换:Spring 会自动根据方法参数的类型进行类型转换。例如,如果请求中的参数是一个字符串,而方法参数是整数类型,Spring 将尝试将字符串转换为整数。

  7. 支持多个值@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> 类型的对象,从而避免了类型转换错误。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值