内容简介:我们在写Rest API接口时候会用到很多的@RequestParam和@PathVariable进行参数的传递,但是在校验的时候,不像使用@RequestBody那样的直接写在实体类中,我们这篇文章讲解一下如何去校验这些参数。任何与这些条件不匹配的请求都将返回HTTP状态500,并显示默认错误消息。如果我们尝试调用
我们在写Rest API接口时候会用到很多的@RequestParam和@PathVariable进行参数的传递,但是在校验的时候,不像使用@RequestBody那样的直接写在实体类中,我们这篇文章讲解一下如何去校验这些参数。
依赖配置
- 要使用Java Validation API,我们必须添加 validation-api 依赖项:
<dependency> <groupId>javax.validation</groupId> <artifactId>validation-api</artifactId> <version>2.0.1.Final</version> </dependency>
- 通过添加@Validated注解来启用控制器中的@RequestParams和@PathVariables的验证:
@RestController @RequestMapping("/") @Validated public class Controller { // ... }
校验@RequestParam
- 我们将数字作为请求参数传递给控制器方法
@GetMapping("/name-for-day") public String getNameOfDayByNumber(@RequestParam Integer dayOfWeek) { // ... }
- 我们保证dayOfWeek的值在1到7之间,我们使用@Min和@Max注解
@GetMapping("/name-for-day") public String getNameOfDayByNumber(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) { // ... }
任何与这些条件不匹配的请求都将返回HTTP状态500,并显示默认错误消息。
如果我们尝试调用 http://localhost:8080/name-for-day?dayOfWeek=24 这将返回以下响应信息:
There was an unexpected error (type=Internal Server Error, status=500). getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7
当然我们也可以在@Min和@Max注解后面加上 message
参数进行修改默认的返回信息。
校验@PathVariable
和校验@RequestParam一样,我们可以使用javax.validation.constraints包中的注解来验证@PathVariable。
- 验证String参数不是空且长度小于或等于10
@GetMapping("/valid-name/{name}") public void test(@PathVariable("name") @NotBlank @Size(max = 10) String username) { // ... }
- 任何名称参数超过10个字符的请求都会导致以下错误消息:
There was an unexpected error (type=Internal Server Error, status=500). createUser.name:size must be between 0 and 10
通过在@Size注解中设置message参数,可以覆盖默认消息。
其实我们可以看到校验@RequestParam和@PathVariable参数和我们校验@RequestBody方式一致,只不过一个是写在了实体中,一个写在了外部,当然我们也可以将@RequestParam的参数写入到实体类中,进行使用@RequestParam注解进行引入,比如我们使用一个分页的实例
- 分页实体类
/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * <p> * http://www.apache.org/licenses/LICENSE-2.0 * <p> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.zhuanqb.param.page; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; import org.hibernate.validator.constraints.NotBlank; import org.hibernate.validator.constraints.NotEmpty; import javax.validation.constraints.Max; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; /** * PageParam <br/> * 描述 : PageParam <br/> * 作者 : qianmoQ <br/> * 版本 : 1.0 <br/> * 创建时间 : 2018-09-23 下午7:40 <br/> * 联系作者 : <a href="mailTo:shichengoooo@163.com">qianmoQ</a> */ @Data @ToString @NoArgsConstructor @AllArgsConstructor public class PageParam { @NotNull(message = "每页数据显示数量不能为空") @Min(value = 5) @Max(value = 100) private Integer size; // 每页数量 @NotNull(message = "当前页显示数量不能为空") @Min(value = 1) @Max(value = Integer.MAX_VALUE) private Integer page; // 当前页数 private Boolean flag = true; }
- @RequestParam调用方式
@GetMapping(value = "list") public CommonResponseModel findAll(@Validated PageParam param) { ... }
这样的话可以使我们的校验定制化更加简单。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 更加灵活的参数校验,Spring-boot自定义参数校验注解
- 一坨一坨的 if/else 参数校验,终于被 Spring Boot 参数校验组件整干净了
- gin - validator 参数校验
- 【快学springboot】4.接口参数校验
- SpringBoot 实战 (十五) | 服务端参数校验之一
- 我是怎么进行SpringMVC参数校验的?
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。