后端对前端参数校验(包括自定义注解)
程序开发
2023-09-23 23:52:19
不错的文章:
@Pattern注解中常用的校验正则表达式札记 - 灰信网(软件开发博客聚合)
1.
@NotNull:不能为null,但可以为empty, 用在基本类型上,Long,Integer,
@NotEmpty:不能为null,而且长度必须大于0 ,用在集合类上面
@NotBlank:只能作用在String上,不能为null,不能为 empty(or ""),而且调用trim()后,长度必须大于0 (使用的话,需要在controller层加上@Valid)
@GetMapping(value = "/testValid")public String getBuyedHousees(@Valid Query query,BindingResult results) {if (results.hasErrors()) {return new BaseResponse( "500", results.getFieldError().getDefaultMessage(),results.getFieldError().getDefaultMessage());}return .........;}
// 实体类的内容
@NotBlank(message = "主键非空")
private String id;
// @Pattern (只对 字符串有效,如果是 Integer 类型的就报错,Integer 类型的用 Size or max min etc)
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;// 正则表达式说明:
//
// ^string : 匹配以 string 开头的字符串
// string$ :匹配以 string 结尾的字符串
//^string$ :精确匹配 string 字符串
// (^Man$|^Woman$|^UGM$|^$) : 值只能在 Man,Woman,UGM 这三个值中选择(最后一个是空串)@Pattern(regexp = "(^1$|^2$|^$)", message = "sex 值不在可选范围")// 说明:最后一个是允许空串 eg:前段传 name:"" private String age;@Pattern(regexp = "^(http://).*$", message = "访问地址只允许以http开头!")@Pattern(regexp = "^((http://)|(https://)).*$", message = "访问地址只允许以http或者https开头!")@Pattern(regexp = "^(\\s&&[^\\f\\n\\r\\t\\v])*|[A-Za-z0-9\u4e00-\u9fa5]+$", message = "简称只允许输入汉字数字和字母或者为空!")// 接口测试,一个参数只可以传 0和1 是Integer 类型,但是 测试在做接口测试的时候,会传 字符串 a ,这时候就报错,我们需要 对参数校验,只允许传入数值型字符串, 这样 把Integer 类型转成 字符串 ,同时对字符串 的 值 做校验,这样就可以通过了@NotNull(message = "操作状态非空")// Pattern 只能校验字符串 (校验数值类字符串)@Pattern(regexp = "(^0$|^1$)", message = "操作状态不合法只允许传入0后者1")private String status ;/**** ^\s*$ 表示 null** ^$ 表示空串*/@Pattern(regexp = "(^$|^\\s*$|^0$|^1$)", message = "不合法只允许传入空串,null,0或者1")private String type;// @Range(min = 0, max = 1) 是对Integer 有效,但是 接口测试 传 a 会报错,所以 不怎么用ql语句:^(select|drop|delete|create|update|insert).*$
匹配特定数字:
^[1-9]d*$ //匹配正整数
^-[1-9]d*$ //匹配负整数
^-?[1-9]d*$ //匹配整数
^[1-9]d*|0$ //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$ //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$ //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$ //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$ //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$ //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$ //匹配非正浮点数(负浮点数 + 0)必须包含 aaa or bbb^.*(aaa|bbb).*$
测试:
@PostMapping("/a")public String a(@Valid @RequestBody Users users , BindingResult result){if (result.hasErrors()) {return result.getFieldErrors().get(0).getDefaultMessage();}return "success";}
1. 自定义注解校验(手机号,金额是否合法等)
以金额是否合法(最大小数点后两位,必须大于0)
① 定义注解 ② 定义校验器(需要实现 javax.validation.ConstraintValidator 这个接口)
定义注解:
/**
* @Description: 金额校验
* @Author: guoyiguang
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
// 指定 这个注解 用哪个校验器去校验
@Constraint(validatedBy = MoneyValidator.class)
public @interface Money {String message () default "money 不合法 ";// 下面两行必须加否则报错Class>[] groups() default { };Class extends Payload>[] payload() default { };}
定义校验器:
import com.example.demo.entity.annotation.Money;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.math.BigDecimal;/*** @program: springboot_01* @description: 校验金额* @author: guoyiguang* @create: 2021-05-07 14:10**/
public class MoneyValidator implements ConstraintValidator {@Overridepublic void initialize(Money money) {}@Overridepublic boolean isValid(BigDecimal bigDecimal, ConstraintValidatorContext constraintValidatorContext) {// 不能为空if (null == bigDecimal) {return false;}String regExp= "^(([0-9]|([1-9][0-9]{0,9}))((\.[0-9]{1,2})?))$";return bigDecimal.toString().matches(regExp);}
}
使用:在 User 上 加 @Money注解
@Data
public class User {private Integer id;@NotBlank(message = "用户 name 非空")private String name;@Range(min = 0, max = 1, message = "性别选择错误")private Integer sex;/*** @Valid 可以用来 校验属性(和@validated 的主要区别),必须加这个,否则进不了 Order 里的 属性值校验*/
// @Valid
// @NotEmpty(message = "orderList 非空")
// private List orderList;@Money(message = "金额格式错误")private BigDecimal amount;}
测试:
注解生效:
标签:
上一篇:
使用递归算法实现DropDownList下拉框中显示树状图
下一篇:
相关文章
-
无相关信息