当前位置: 首页 > 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 中是如何启动的(一)
  • 【人工智能与深度学习】判别性循环稀疏自编码器和群体稀疏性
  • [译] React v16.8: 含有Hooks的版本
  • avalon2.2的VM生成过程
  • canvas绘制圆角头像
  • EventListener原理
  • Laravel 中的一个后期静态绑定
  • leetcode386. Lexicographical Numbers
  • opencv python Meanshift 和 Camshift
  • php的插入排序,通过双层for循环
  • php面试题 汇集2
  • yii2权限控制rbac之rule详细讲解
  • 工程优化暨babel升级小记
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 协程
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一起参Ember.js讨论、问答社区。
  • 译米田引理
  • 用Visual Studio开发以太坊智能合约
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • UI设计初学者应该如何入门?
  • 交换综合实验一
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • %@ page import=%的用法
  • (12)Linux 常见的三种进程状态
  • (分布式缓存)Redis分片集群
  • (译) 函数式 JS #1:简介
  • (转)h264中avc和flv数据的解析
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ../depcomp: line 571: exec: g++: not found
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .NET 5种线程安全集合
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET IoC 容器(三)Autofac
  • .net 无限分类
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • @RestController注解的使用
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [20170728]oracle保留字.txt