我们在写 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) {
…
}
这样的话可以使我们的校验定制化更加简单。