素材巴巴 > 程序开发 >

后端对前端参数校验(包括自定义注解)

程序开发 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[] 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;}
 

 测试:

注解生效:


标签:

素材巴巴 Copyright © 2013-2021 http://www.sucaibaba.com/. Some Rights Reserved. 备案号:备案中。