咱们在写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) {
        ...
    }

这样的话能够使咱们的校验定制化更加简单。