Spring校验@RequestParams和@PathVariables参数

Easter79
• 阅读 679

我们在写Rest API接口时候会用到很多的@RequestParam和@PathVariable进行参数的传递,但是在校验的时候,不像使用@RequestBody那样的直接写在实体类中,我们这篇文章讲解一下如何去校验这些参数。

依赖配置


  • 要使用Java Validation API,我们必须添加validation-api依赖项:
  1. <dependency>

  2. <groupId>javax.validation</groupId>

  3. <artifactId>validation-api</artifactId>

  4. <version>2.0.1.Final</version>

  5. </dependency>

  • 通过添加@Validated注解来启用控制器中的@RequestParams和@PathVariables的验证:
  1. @RestController

  2. @RequestMapping("/")

  3. @Validated

  4. public class Controller {

  5. // ...

  6. }

校验@RequestParam


  • 我们将数字作为请求参数传递给控制器方法
  1. @GetMapping("/name-for-day")

  2. public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) {

  3. // ...

  4. }

  • 我们保证dayOfWeek的值在1到7之间,我们使用@Min和@Max注解
  1. @GetMapping("/name-for-day")

  2. public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {

  3. // ...

  4. }

任何与这些条件不匹配的请求都将返回HTTP状态500,并显示默认错误消息。

如果我们尝试调用http://localhost:8080/name-for-day?dayOfWeek=24这将返回以下响应信息:

  1. There was an unexpected error (type=Internal Server Error, status=500).

  2. getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7

当然我们也可以在@Min和@Max注解后面加上 message参数进行修改默认的返回信息。

校验@PathVariable


和校验@RequestParam一样,我们可以使用javax.validation.constraints包中的注解来验证@PathVariable。

  • 验证String参数不是空且长度小于或等于10
  1. @GetMapping("/valid-name/{name}")

  2. public void test(@PathVariable("name") @NotBlank @Size(max = 10) String username) {

  3. // ...

  4. }

  • 任何名称参数超过10个字符的请求都会导致以下错误消息:
  1. There was an unexpected error (type=Internal Server Error, status=500).

  2. createUser.name:size must be between 0 and 10

通过在@Size注解中设置message参数,可以覆盖默认消息。

其实我们可以看到校验@RequestParam和@PathVariable参数和我们校验@RequestBody方式一致,只不过一个是写在了实体中,一个写在了外部,当然我们也可以将@RequestParam的参数写入到实体类中,进行使用@RequestParam注解进行引入,比如我们使用一个分页的实例

  • 分页实体类
  1. /**

  2. * Licensed to the Apache Software Foundation (ASF) under one

  3. * or more contributor license agreements.  See the NOTICE file

  4. * distributed with this work for additional information

  5. * regarding copyright ownership.  The ASF licenses this file

  6. * to you under the Apache License, Version 2.0 (the

  7. * "License"); you may not use this file except in compliance

  8. * with the License.  You may obtain a copy of the License at

  9. * <p>

  10. * http://www.apache.org/licenses/LICENSE-2.0

  11. * <p>

  12. * Unless required by applicable law or agreed to in writing, software

  13. * distributed under the License is distributed on an "AS IS" BASIS,

  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  15. * See the License for the specific language governing permissions and

  16. * limitations under the License.

  17. */

  18. package com.zhuanqb.param.page;

  19. import lombok.AllArgsConstructor;

  20. import lombok.Data;

  21. import lombok.NoArgsConstructor;

  22. import lombok.ToString;

  23. import org.hibernate.validator.constraints.NotBlank;

  24. import org.hibernate.validator.constraints.NotEmpty;

  25. import javax.validation.constraints.Max;

  26. import javax.validation.constraints.Min;

  27. import javax.validation.constraints.NotNull;

  28. /**

  29. * PageParam <br/>

  30. * 描述 : PageParam <br/>

  31. * 作者 : qianmoQ <br/>

  32. * 版本 : 1.0 <br/>

  33. * 创建时间 : 2018-09-23 下午7:40 <br/>

  34. * 联系作者 : <a href="mailTo:shichengoooo@163.com">qianmoQ</a>

  35. */

  36. @Data

  37. @ToString

  38. @NoArgsConstructor

  39. @AllArgsConstructor

  40. public class PageParam {

  41. @NotNull(message = "每页数据显示数量不能为空")

  42. @Min(value = 5)

  43. @Max(value = 100)

  44. private Integer size; // 每页数量

  45. @NotNull(message = "当前页显示数量不能为空")

  46. @Min(value = 1)

  47. @Max(value = Integer.MAX_VALUE)

  48. private Integer page; // 当前页数

  49. private Boolean flag = true;

  50. }

  • @RequestParam调用方式
  1. @GetMapping(value = "list")

  2. public CommonResponseModel findAll(@Validated PageParam param) {

  3. ...

  4. }

这样的话可以使我们的校验定制化更加简单。

本文分享自微信公众号 - Spring中文网(china-spring-all)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
kenx kenx
2年前
SpringBoot Validation优雅的全局参数校验
前言我们都知道在平时写controller时候,都需要对请求参数进行后端校验,一般我们可能会这样写javapublicStringadd(UserVOuserVO)if(userVO.getAge()null)return"年龄不能为空";if(userVO.getAge()120)r
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
MaxSky MaxSky
3年前
PHP 微信公众号消息加解密
公众号配置根据提示设置即可:【图中信息均为无意义数据,仅供参考。注意服务器地址需可接收GET/POST两种请求】AESKey直接点一下随机生成即可,Token可以生成一个UUID再把UUID进行MD5一次即可。接收关注事件消息示例请求参数校验这一步根据项目情况,可供参考:(Lumen框架)php$valida
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
Java中的参数验证(非Spring版)
1\.Java中的参数验证(非Spring版)1.1.前言为什么我总遇到这种非正常问题,我们知道很多时候我们的参数校验都是放在controller层的传入参数进行校验,我们常用的校验方式就是引入下列的jar包,在参数中添加@Validated,并对Bean对象的参数做不
Easter79 Easter79
2年前
SpringBoot2 学习10 Controller接收参数的方式
地址传值@PathVariable获取路径参数。即url/{id}这种形式。?传值@RequestParam获取查询参数。即url?name这种形式用注解@RequestParam绑定请求参数到方法入参当请求参数username不存在时会有异常发生,可以通过设置属性requiredfalse解决,例如:@R
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k