自定义验证规则进行数据验证+JSR-303验证注解

依赖项

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>

自定义验证器

要确保验证器正常工作,需要确保以下几点:

  1. 验证器类(这里是LoginValidator)必须实现org.springframework.validation.Validator接口,并且必须有一个无参构造函数。
  2. 在控制器类中,必须使用@Validated注解来指示验证器应用于请求参数上。
  3. 在请求方法中,必须将请求参数作为参数传递给验证器,并且必须将验证器实例绑定到WebDataBinder。
LoginValidator.java
package com.example.springboot.valid;

import com.example.springboot.param.LoginParam;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

public class LoginValidator implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return clazz.equals(LoginParam.class);
    }

    @Override
    public void validate(Object target, Errors errors) {
        if(target==null){
            errors.rejectValue("",null,"用户不能为空");
            return;
        }
        LoginParam loginParam=(LoginParam) target;
        if(loginParam.getId()==0){
            errors.rejectValue("id",null,"用户id不能为0");
        }
        if(loginParam.getPassword()==null|| loginParam.getPassword().equals("")){
            errors.rejectValue("password",null,"用户密码不能为空");
        }
    }
}

绑定验证器

LoginRegisterController.java
package com.example.springboot.controller;

import com.example.springboot.param.LoginParam;
import com.example.springboot.service.UserService;
import com.example.springboot.valid.LoginValidator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@CrossOrigin
@RestController
public class LoginRegisterController {
    @Autowired
    private UserService userService;

    @InitBinder
    public void initBinder(WebDataBinder binder){
        //绑定验证器
        binder.setValidator(new LoginValidator());
    }

    @PostMapping("/login")
    public String Login(@RequestBody LoginParam loginParam){
        return userService.Login(loginParam);
    }

    @PostMapping("/register")
    public String Register(@Validated @RequestBody LoginParam loginParam, Errors errors){
        if(errors.hasErrors()){
            String log="";
            List<ObjectError> oes=errors.getAllErrors();
            for(ObjectError oe:oes){
                if(oe instanceof FieldError){
                    //字段错误
                    FieldError fe=(FieldError) oe;
                    log+=fe.getDefaultMessage()+"\n";
                }else {
                    //对象错误
                    log+=oe.getDefaultMessage()+"\n";
                }
            }
            return log;
        }
        return userService.Register(loginParam);
    }
}

执行控制器方法前,先执行@InitBinder标注的方法,得到WebDataBinder对象。
binder.setValidator绑定验证器,获取参数后通过自定义的验证其去验证参数。
binder.registerCustomEditor可以进行参数的自定义。
@Validated代表启用验证机制(老版本是@Valid),自动将验证结果放入Errors对象中

fe.getField() 方法返回一个包含异常信息的 Field 对象,该对象描述了异常的字段。例如,如果异常是一个 ParseException 类型的异常,并且它表示一个日期格式错误,那么 getField() 方法将返回一个表示日期的字段的 Field 对象。
fe.getDefaultMessage() 方法返回一个字符串,该字符串表示默认的错误消息。如果未提供特定的错误消息,则该方法将返回一个描述异常类型的简单消息。例如,如果异常是一个 ParseException 类型的异常,并且没有提供特定的错误消息,那么 getDefaultMessage() 方法将返回一个简单的消息,例如 “java.text.ParseException”。

#直接通过注解使用JSR-303验证

LoginParam.java
package com.example.springboot.param;

import lombok.Data;
import jakarta.validation.constraints.NotNull;
import java.io.Serializable;

@Data
public class LoginParam implements Serializable {
	@NotNull
    private int id;
    private String password;
}

JSR-303验证注解有:

@Null:校验对象是否为null。
@NotNull:校验对象是否不为null。
@NotBlank:校验字符串去头尾空格后的长度是否大于0或是否为null。
@NotEmpty:校验字符串是否为null或是否为empty。
@AssertTrue:校验Boolean是否为true@AssertFalse:校验Boolean是否为false@UniqueElements:校验数组/集合的元素是否唯一。
@Size(min,max):校验数组/集合/字符串长度是否在范围之内。
@Length(min,max):校验数组/集合/字符串长度是否在范围之内。
@Range(min,max):校验Integer/Short/Long是否在范围之内。
@Min(number):校验Integer/Short/Long是否大于等于value。
@Max(number):校验Integer/Short/Long是否小于等于value。
@Positive:校验Integer/Short/Long是否为正整数。
@PositiveOrZero:校验Integer/Short/Long是否为正整数或0@Negative:校验Integer/Short/Long是否为负整数。
@NegativeOrZero:校验Integer/Short/Long是否为负整数或0@DecimalMin(decimal):校验Float/Double是否大于等于value。
@DecimalMax(decimal):校验Float/Double是否小于等于value。
@Digits(integer,fraction):校验数字是否符合整数位数精度和小数位数精度。
@Past(date):校验Date/Calendar是否在当前时间之前。
@PastOrPresent(date):校验Date/Calendar是否在当前时间之前或当前时间。
@Future(date):校验Date/Calendar是否在当前时间之后。
@FutureOrPresent(date):校验Date/Calendar是否在当前时间之后或当前时间。
@Email:校验字符串是否符合电子邮箱格式。
@URL(protocol,host,port):校验字符串是否符合URL地址格式。
@CreditCardNumber:信用卡验证。
@Pattern(regexp):校验字符串是否符合正则表达式的规则。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值