postmapping注解参数说明_通过验证框架实现统⼀参数校验
在我们实际项⽬开发过程中,避免不了的就是参数的校验,⼀般参数的校验,分为如下⼏种情况;1.前端直接验证;2. 在Controller层单独
验证;3. 通过集成验证框架验证;显然3种⾥⾯,我们⼀般建议1+3结合的⽅式进⾏参数的校验⽐较合理和安全。在本章我们将围绕HTTP
请求中参数校验的应⽤
Controller⼏种接收参数的⽅式
在介绍验证框架之前,我们来介绍下通过Controller接收参数的⽅式;现在⼤部分都是通过注解的⽅式进⾏参数的接收,主流的有如下⼏种
请求路径参数
@PathVariable 获取路径参数。即url/{id}这种形式。
@RequestParam 获取查询参数。即url?name=这种形式
代码形式如下:
GET localhost:8080/demo/SN20201011021211?name=hank
对应的接收代码如下:
@GetMapping("/demo/{sn}")public void demo(@PathVariable(name = "sn") String sn, @RequestParam(name = "name") String name) {    System.out.println("sn=
Body参数
Body参数⼀般是POST请求,主要有两种⽅式
以JSON格式接收可通过@RequestBody获取对应的参数
以form表单形式提交的,暂⽆注解适配,可直接对象接收
JSON参数接收
例如:添加⽤户的接⼝,PostMan 请求信息如下
对应后端代码1,通过Map接收
@PostMapping(value = "/user/map")public ResultVO createUser(@RequestBody Map<String,Object> user){    String ("name").toString();    return R 对应后代代码2 通过定义的对象接收
@PostMapping(value = "/user")public ResultVO createUser2(@RequestBody User user){    System.out.println("User Info:"+String());    return RV.success(u
FORM 参数接收
form⽅式提交,在PostMan中对应参数如下
对应后端代码如下:
@PostMapping(value = "/user/form")public ResultVO createUser3(User user){    System.out.println("User Info:"+String());    return RV.success(user);}
请求头和Cookie参数
@RequestHeader,是直接获取请求头HttpServletRequest对象⾥⾯Header中的参数
@CookieValue 可以直接获取HttpServletRequest对象⾥⾯Cookies中的参数
通过注解的⽅式获取,分别如下
@GetMapping("demo3")public void demo3(@RequestHeader(name = "myHeader") String myHeader,        @CookieValue(name = "myCookie") String myC
通过硬编码的获取⽅式为
@GetMapping("/demo3")public void demo3(HttpServletRequest request) {    System.out.Header("myHeader"));    for (Cookie cookie : request.g
由上可以看出,通过注解的⽅式可以极⼤简化编码,使我们的代码变得美观⼤⽅,如果通过request对象直接获取,也是可以的,这个主要
是看什么样的需求,⼀般情况下,通过注解的⽅式基本上能满⾜我们的绝⼤部分需求,所以在项⽬中我们⽐较推荐直接通过注解的⽅式获取
参数。
validation框架⽂件上传
⽂件上传主要是基于@RequestParam 结合MultipartFile对象;如下⽰例;
这⾥需要注意,前端的传⼊需要⽤表单⽅式提交,并且在Head的Content-Type⾥⾯加⼊,如下信息
Content-Type: application/x-www-form-urlencoded
对应后端代码如下
@Value("${file.upload.url}")private String filePath;@RequestMapping("/upload")public ResultVO httpUpload(@RequestParam("files") MultipartFile files[]){    for(int 参数校验
在Controller层的参数校验可以分为两种场景,单个参数校验和实体参数校验
单个参数校验
后端代码如下
@RestControllerpublic class ValidateController {    @GetMapping("/getUser")    @Validated    public ResultVO getUserStr(@NotNull(message = "name 不能为空")在Postman请求如下,可以看到请求后,返回了系统异常,应该是被全局异常拦截了
我们再看后台打印的⽇志
如果我们系统中有很多地⽅都⽤到了参数校验,那么我们最好是能够在全局异常拦截处直接拦截ConstraintViolationException异常,并
进⾏统⼀处理,可以在我们前⾯章节讲到的,在加了@RestControllerAdvice注解的GlobalException类中加⼊如下拦截的新⽅法;由于ConstraintViolationException继承了ValidationException异常类,所以我们可以直接拦截⽗类异常,直接进⾏多个不同的校验异常进⾏
处理
@RestControllerAdvicepublic class GlobalException {    /**    * 描述:表单异常拦截    * @param [e]    * @date 2020/11/22    * @Author Hank    **/    @ExceptionH
同样,再通过Postman请求后,得到如下结果
实体参数校验
⼀般我们在传⼊参数⽐较少的情况下,就直接⽤上⾯的⽅法进⾏了验证了,但是,如果我们传⼊的是⼀个对象,直接在⽅法上⼀个⼀个属性
设置,就显得有点不美观了,因此我们⼀般都是封装⼀个接收参数的对象。如下⾯实例提供的,添加⽤户接⼝,我们对⽤户对象的变量设置
了校验规则,如下
@Dataclass Person {    @NotNull(message = "名称不能为空")    @Max(value = 30, message = "名称不能超过30个字符")    String name;    @Max(value = 200, mes 在Controller类中我们增加添加⽤户的⽅法,这⾥我们需要注意,我们只需要在⽅法对应的参数Person对象前⾯加上@Valid注解即可
/**    * 描述:添加⼀个 Person    * @param [person]    * @date 2020/11/22    * @Author Hank    **/    @PostMapping(value = "/person")    public ResultVO<Per
其实⼤家可能就会问,那要是参数校验不同过,这⾥应该是抛出什么异常呢,当我们执⾏如上代码,设定超出范围的参数后,在后端可以看
到异常如下
可以看到,这⾥抛出的MethodArgumentNotValidException与上⾯的异常截然不同;相同道理,我依然在GlobalException类中加⼊对MethodArgumentNotValidException异常的全局拦截即可
/**    * 描述: ⽅法参数验证异常拦截    * @param [e]    * @date 2020/11/22    * @Author Hank    **/    @ExceptionHandler(value = MethodArgumentNotValidEx
Validated与Valid区别
@Validated: ⽤在⽅法的⼊参上⽆法单独提供嵌套验证功能。不能⽤在成员属性(字段)上,也⽆法提⽰框架进⾏嵌套验证。能配合嵌套验证注解@Valid进⾏嵌套验证。
@Valid:⽤在⽅法⼊的参上⽆法单独提供嵌套验证功能。能够⽤在成员属性(字段)上,提⽰验证框架进⾏嵌套验证。能配合嵌套验证注解@Valid进⾏嵌套验证。
如上Person对象,如果⾥⾯再有⼀个对象,⽐如还是Person,在提交的过程中,需要这种嵌套验证,就需要通过使⽤Valid的嵌套验证功
能,即可将代码修改如下;
@Dataclass Person {    @NotNull(message = "名称不能为空")    @Size(min = 2,max = 30, message = "名称长度限定在2-30之间的长度")    String name;    @Max(v 常⽤参数校验的注解
这⾥我们主要介绍在springboot中的⼏种参数校验⽅式。常⽤的⽤于参数校验的注解如下:
@AssertFalse 所注解的元素必须是Boolean类型,且值为false
@AssertTrue 所注解的元素必须是Boolean类型,且值为true
@DecimalMax 所注解的元素必须是数字,且值⼩于等于给定的值
@DecimalMin 所注解的元素必须是数字,且值⼤于等于给定的值
@Digits 所注解的元素必须是数字,且值必须是指定的位数
@Future 所注解的元素必须是将来某个⽇期
@Max 所注解的元素必须是数字,且值⼩于等于给定的值
@Min 所注解的元素必须是数字,且值⼩于等于给定的值
@Range 所注解的元素需在指定范围区间内
@NotNull 所注解的元素值不能为null
@NotBlank 所注解的元素值有内容
@Null 所注解的元素值为null
@Past 所注解的元素必须是某个过去的⽇期
@PastOrPresent 所注解的元素必须是过去某个或现在⽇期
@Pattern 所注解的元素必须满⾜给定的正则表达式
@Size 所注解的元素必须是String、集合或数组,且长度⼤⼩需保证在给定范围之内
@Email 所注解的元素需满⾜Email格式

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。