- 品牌名称后端参数校验示例
- 品牌其他参数校验
- JSR303校验步骤总结
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 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;
}
再次发送请求, 可以看到校验的参数如下, 提示了一些参数不能为空.
- 给Bean添加校验注解,
javax.validation.constraints
包下面的, 并定义自己的message
提示 - 在Controller接口开启校验功能 , 加上
@Valid
注解. 效果是如果有校验错误的参数, 会有默认的响应, 但是不符合项目统一的响应, 因此下一节会写一个统一的响应. - 给校验的接口后面, 统一跟一个BindingResult , 可以获得此次校验的结果.