当前位置: 首页 > news >正文

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

文章目录

  • 一、SpringBoot中的参数传递注解
    • 1、@PathVariable
    • 2、@RequestParam
    • 3、@RequestBody
    • 4、不用注解或者@ModelAttribute
  • 二、参数类型校验失败后的三种异常

一、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或者空注解接参,验证失败后抛出

相关文章:

  • 【C语言学习】变量和数据类型
  • 【Vue2从入门到精通】详解Vue.js的15种常用指令及其使用场景
  • SpringMVC(8)——SSM整合
  • 【内网安全】横向移动Exchange服务有账户CVE漏洞无账户口令爆破
  • 10、Django开发总结:Django缓存Cache应用场景、设置以及高级使用技巧
  • 【黑客技术】LOIC —— 低轨道离子炮工具使用
  • 华为OD机试用java实现 -【吃火锅】
  • C语言 —— 数组
  • 35岁大龄程序员职业转型规划
  • IntelliJ IDEA 2023.1 最新变化
  • Qt音视频开发22-音频播放QAudioOutput
  • 递归--【天梯L2】愿天下有情人都是失散多年的兄妹
  • 第七章 react组件实例中三大属性之props
  • 面试官:Tomcat 在 SpringBoot 中是如何启动的(一)
  • 【人工智能与深度学习】判别性循环稀疏自编码器和群体稀疏性
  • Brief introduction of how to 'Call, Apply and Bind'
  • CentOS 7 防火墙操作
  • JavaScript 基本功--面试宝典
  • Java超时控制的实现
  • Median of Two Sorted Arrays
  • Spring框架之我见(三)——IOC、AOP
  • STAR法则
  • yii2中session跨域名的问题
  • 对JS继承的一点思考
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 如何利用MongoDB打造TOP榜小程序
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 我看到的前端
  • 项目实战-Api的解决方案
  • 一、python与pycharm的安装
  • hi-nginx-1.3.4编译安装
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (arch)linux 转换文件编码格式
  • (C++17) std算法之执行策略 execution
  • (层次遍历)104. 二叉树的最大深度
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (离散数学)逻辑连接词
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (算法设计与分析)第一章算法概述-习题
  • (转载)Linux 多线程条件变量同步
  • .Net Core与存储过程(一)
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET性能优化(文摘)
  • /var/lib/dpkg/lock 锁定问题
  • ??eclipse的安装配置问题!??
  • @Async注解的坑,小心
  • @Valid和@NotNull字段校验使用
  • @我的前任是个极品 微博分析
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(白虎组)
  • [ 攻防演练演示篇 ] 利用通达OA 文件上传漏洞上传webshell获取主机权限
  • [20181219]script使用小技巧.txt
  • [android] 请求码和结果码的作用