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

不错的文章:

@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;


}

 测试:

注解生效:

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值