使用javax.validation.constraints对请求体进行统一校验
作者:半山惊竹
这篇文章主要介绍了使用javax.validation.constraints对请求体进行统一校验方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
一、序言
在处理请求的时候,通常需要对参数进行校验是否为空,参数的长度等进行校验,
如果在controller层一个一个的写校验就很麻烦,于是就有了javax.validation.constraints包。
二、注解类型
不同的注解用于不同的数据类型,小伙伴们可以下载源码看一些常用的比如非空限制的注解的区别,
我这里截几个图:
所以我一般的处理是,如果是字符串类型就用@NotBlank,
如果是集合数组之类就用@NotEmpty,如果是对象就用@NotNull
当然还有别的包的校验类型,比如限制请求参数的长度就可以用到另外一个包里的注解了,在pom中增加依赖:
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> <version>6.0.17.Final</version> <scope>compile</scope> </dependency>
三、使用注解
3.1 请求实体类增加注解
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; /** * @author FanHuiFang * @version 1.0 * @date 2024年04月27日 19:58 */ @Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserSaveReq { @NotBlank(message = "name不能为空") private String name; @NotNull(message = "年龄不能为空") private Long age; @NotEmpty(message = "朋友列表不能为空") private List<String> friends; @NotNull(message = "客户手机号不能为空") @Length(min = 8, max = 16, message = "客户手机号不合法") private String userPhone; }
3.2 控制层
import org.springframework.web.bind.annotation.*; import javax.validation.Valid; import org.springframework.validation.Errors; @PostMapping(value = "/saveUser") public ResultBean<String> saveUser(@Valid @RequestBody UserSaveReq req, Errors errors) { if (Objects.isNull(req)) return ResultBean.fail("缺少必要的请求参数"); if (errors.hasErrors() && Objects.nonNull(errors.getFieldError())) { String errorMessage = errors.getFieldError().getDefaultMessage(); log.error("保存用户信息时请求参数错误:{}", errorMessage); return ResultBean.fail(errorMessage); } //保存处理...... }
当进行请求的时候,如果缺少某个参数,或者比如长度不对,就会返回异常信息,这样就不用一个个的进行校验了。
注意:这里请求参数中需要加上@Valid注解,如果不加,应该是校验没有生效的
比如手机号号长度不对,就会返回
{ "code": 0, "message": "客户手机号不合法", "data": null }
这里也附带一下我用的ResultBean,以免看的云里雾里的:
import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.ToString; import java.io.Serializable; /** * @author FanHuiFang * @version 1.0 * @date 2024年04月27日 21:50 */ @Builder @Data @AllArgsConstructor @ToString public class ResultBean<T> implements Serializable { private Integer code; private String message; private T data; public ResultBean(int code, String message, T data) { this.code = code; this.data = data; this.message = message; } public ResultBean(Integer code, String message) { this.code = code; this.message = message; } public static <T> ResultBean<T> data(T data) { return data("操作成功", data); } public static <T> ResultBean<T> data(String message, T data) { return data(1, message, data); } public static <T> ResultBean<T> data(int code, String message, T data) { return new ResultBean<>(code, message, data); } public static <T> ResultBean<T> fail(String message, T data) { return new ResultBean<>(0, message, data); } public static <T> ResultBean<T> fail(Integer code, String message) { return new ResultBean<>(code, message); } public static <T> ResultBean<T> fail(String message) { return new ResultBean<>(0, message, null); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。