SpringBoot接参注解与校验失败后的三种异常

有时候,不是因为你没有能力,也不是因为你缺少勇气,只是因为你付出的努力还太少,所以,成功便不会走向你。而你所需要做的,就是坚定你的梦想,你的目标,你的未来,然后以不达目的誓不罢休的那股劲,去付出你的努力,成功就会慢慢向你靠近。

导读:本篇文章讲解 SpringBoot接参注解与校验失败后的三种异常,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、SpringBoot中的参数传递注解

先看看非json下参数的接收和传递:

1、@PathVariable

@PathVariable注解用于从url来获取参数值。URL 中的 {xxx} 占位符可以通过 @PathVariable(“xxx“) 绑定到操作方法的入参中

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/testPathVariable/{id}/{name}")
    public Object testPathVariable(@PathVariable(value = "id") Integer id, @PathVariable(value = "name") String username){
		return null;
	}
}

这里不管是get还是post都一样,在路径传参:

在这里插入图片描述

2、@RequestParam

@PathValiable 是从 url 模板中获取参数值, 即这种风格的 url:http://localhost:8088/test/testPathVariable/{id}

@RequestParam 是从 request 表单里面获取参数值,即这种风格的 url: http://localhost:8088/test/testRequestparam?id=1

GET下的@RequestParam

@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping("/testRequestParam")
    public Object testRequestParam(@RequestParam Integer id){
		return null;
	}
}

调用:

在这里插入图片描述

当然不是只能int、String,Map集合、数组都行:参考这里

 
@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(@RequestParam Map<String, Object> map){
 
        return "图书: " + map.get("name") +  " 的作者为: " + map.get("author");
    }
}

在这里插入图片描述

@RequestParam注解可以设置value属性和required属性:

  • value设置前端传参时的参数名。@RequestParam(value = “name”) String username,这时前端传参名必须是name
  • required属性设置这个参数是否为必传,false时,默认给对应参数赋值null。注意如果参数是int类型,赋值null会报错

POST下的@RequestParam

假设此时需要从前端接受username和password:

@PostMapping("/testRequestParam")
    public Object testRequestParam(@RequestParam String username, @RequestParam String password){
        return null;
    }

调用:
在这里插入图片描述
但其实当要接收的参数较多的时候,这样一个个参数去写不合理,应该封装到一个dto类中,使用别的注解接参。接下来看json传参,用实体类(Dto类)接参的注解:


3、@RequestBody

@RequestBody注解用于POST请求上,接收json实体参数.

@PostMapping("/testRequestBody")
    public Object testRequestBody(@RequestBody AddUserDto dto) {
        
        return null;
    }

调用:
在这里插入图片描述

4、不用注解或者@ModelAttribute

刚才说到:controller层用实体类接收传参的时候,POST请求用@RequestBody注解,而GET请求,用dto实体类去接收前端传参时,是不加注解或者用@ModelAttribute

写法1:

@GetMapping("/testGetDto")
    public Object testGetDto( UserInfoDto dto) {
        
        return null;
    }

//接收到的username和password是实体中的属性,此时SpringBoot会帮我们自动填充到实体中

写法2:

@GetMapping("/testGetDto")
    public Object testGetDto(@ModelAttribute UserInfoDto dto) {
        
        return null;
    }

调用:

在这里插入图片描述

总结:

  • controller层使用基本数据类型来接参,用@PathVariable或者@RequestParam
  • controller层使用dto实体类接参,POST用@RequestBody,GET不用注解或者用@ModelAttribute

二、参数类型校验失败后的三种异常

日常开发中,常常在dto类的属性中使用注解进行参数合法性校验,如@NotNull、@Min,然后使用@Valid或者@Validated开启校验,当校验不通过时,抛出异常,由全局异常处理器去捕捉拦截处理。而不同的情况下,抛出的是不同类型的异常:

  • MethodArgumentNotValidException异常:@RequestBody(POST)接参验证失败后抛出
  • ConstraintViolationException异常: @RequestParam接参验证失败后抛出
  • BindException异常:GET中使用@ModelAttribute或者空注解接参,验证失败后抛出

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/146061.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!