validation-api-2.0.1.Final.jar包中 ,提供了如下的注解, 用于参数的校验 例如有如下的注解
@NotNull The annotated element must not be null. Accepts any type. 用于校验不能为null@NotEmpty The annotated element must not be null nor empty. Supported types : CharSequence(字符集合) Collection(集合) Map Array(数组) 即校验字符集合,集合, map, 数组不能为null ,@NotBlank: The annotated element must not be null and must contain at least one non-whitespace character. Accepts CharSequence. 用于校验字符串, 不能为null , 并且至少有一个字符.示例: 在品牌实体类name属性加上@NotBlank 注解, 用于校验不能为null , 且至少要有一个字符 在相应的接口上加上@Valid 才能使得参数校验的功能生效 开启产品的服务, postman中输入如下的请求, 进行测试 localhost:9898/product/brand/save name 传递一个空字符串 响应的参数如下 . 提示了参数的错误, 但是响应的数据格式不符合规范.
{ "timestamp": "2020-10-04T07:08:49.302+0000", "status": 400, "error": "Bad Request", "errors": [ { "codes": [ "NotBlank.brandEntity.name", "NotBlank.name", "NotBlank.java.lang.String", "NotBlank" ], "arguments": [ { "codes": [ "brandEntity.name", "name" ], "arguments": null, "defaultMessage": "name", "code": "name" } ], "defaultMessage": "不能为空", "objectName": "brandEntity", "field": "name", "rejectedValue": "", "bindingFailure": false, "code": "NotBlank" } ], "message": "Validation failed for object='brandEntity'. Error count: 1", "path": "/product/brand/save" }提示信息是在hibernate-validator-6.0.18.Final.jar 包下的ValidationMessages_zh_CN.properties文件中, 如下图所示 其注解有属性message , 用于给不符合参数校验的提示信息 例如可以给品牌名校验提示品牌名称至少填写一个字符! 重启服务 再次发送请求, 可以看到如下的提示. 后端接口可以写成如下的形式 , 在接口方法的形式参数上写 BindingResult 用于获取校验的参数的结果.
/** * 保存 */ @RequestMapping("/save") public R save(@Valid @RequestBody BrandEntity brand , BindingResult result){ //判断是否有参数错误 if (result.hasErrors()) { HashMap<String, String> errorMap = new HashMap<>(); result.getFieldErrors().forEach((item) -> { //获取错误提示消息 String message = item.getDefaultMessage(); // 获取错误属性的名称 String field = item.getField(); errorMap.put(field, message); }); return R.error(400, "提交的数据不合法").put("data", errorMap); } else { brandService.save(brand); return R.ok(); } }改造之后, 响应数据如下 :
修改品牌实体类如下, 给品牌实体类的其他属性, 也加上参数校验的注解. @Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母") 为正则表达式, 校验是否属于字母. @Min(value = 0, message = "排序必须为大于等于0的正整数") 用于校验数字的最小值是否为0.
package com.atguigu.gulimall.product.entity; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import lombok.Data; import org.hibernate.validator.constraints.URL; import javax.validation.constraints.*; /** * 品牌 * * @author thc * @email thc@gmail.com * @date 2020-06-25 11:28:26 */ @Data @TableName("pms_brand") public class BrandEntity implements Serializable { private static final long serialVersionUID = 1L; /** * 品牌id */ @TableId private Long brandId; /** * 品牌名 */ @NotBlank(message = "品牌名称至少填写一个字符!") private String name; /** * 品牌logo地址 */ @NotEmpty @URL(message = "logo必须是一个合法的url地址") private String logo; /** * 介绍 */ private String descript; /** * 显示状态[0-不显示;1-显示] */ private Integer showStatus; /** * 检索首字母 */ @NotEmpty @Pattern(regexp = "^[a-zA-Z]$",message = "检索首字母必须是一个字母") private String firstLetter; /** * 排序 */ @NotNull @Min(value = 0, message = "排序必须为大于等于0的正整数") private Integer sort; }再次发送请求, 可以看到校验的参数如下, 提示了一些参数不能为空.