概述
不错的文章:
@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<Money,BigDecimal> {
@Override
public void initialize(Money money) {
}
@Override
public 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<Order> orderList;
@Money(message = "金额格式错误")
private BigDecimal amount;
}
测试:
注解生效:
最后
以上就是激情画板为你收集整理的后端对前端参数校验(包括自定义注解)的全部内容,希望文章能够帮你解决后端对前端参数校验(包括自定义注解)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复