SpringBoot参数校验和自定义参数校验

SpringMvc参数校验

Spring中提供了一系列用于参数校验的注解

基础使用

在实体类具体的字段上添加对应的校验注解和,错误信息即可

注:使用前一定要记得添加hibernate的依赖

  1. 在实体类中添加上校验注解
package com.sy.dto;

import lombok.Data;
import org.hibernate.validator.constraints.NotBlank;
import javax.validation.constraints.Past;
import java.util.Date;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/6-14:00
 **/

@Data
public class User {
    private String id;
    @NotBlank(message = "用户名不能为空")
    private String username;
    @NotBlank(message = "密码不能为空")
    private String password;
    @Past(message = "时间不符")
    private Date birthday;
}
  1. 还需要在接口处的参数添加@Valid注解才可以生效(没有在参数处加@Valid注解时,参数校验不会生效)
package com.imooc.web.controller;

import com.fasterxml.jackson.annotation.JsonView;
import com.imooc.dto.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/5-10:51
 **/
@RestController
public class UserController {
    
    @PutMapping("/user/{id}")
    public String update(@PathVariable("id")String id,@Valid @RequestBody User user, BindingResult errors){
        //使用参数校验后,如果参数校验检查出有错的参数,BindingResult对象中会携带对应的信息
        //message中的信息就是在字段中填写的message
        if (errors.hasErrors()) {
            errors.getAllErrors().stream().forEach(error->{
                FieldError fieldError = (FieldError) error;
                String message = fieldError.getField()+":"+error.getDefaultMessage();
                System.out.println(message);
            });
        	return "参数无效,修改失败";	
        }
        System.out.println(user);
        return "用户信息修改成功";
    }
}

常用注解(Hibernate Validator)

注解名称效果
@NotNull值不能为空
@Null值必须为空
@Pattern(regex="")字符串必须匹配正则表达式
@Size(min=,max=)集合的元素数量必须在min和max之间
@Email字符串必须是Email地址
@Length(min=,max=)检查字符串的长度
@NotBlank字符串必须有字符
@NotEmpty字符串不为null,集合有元素
@Range(min=,max=)数字必须大于等于min,小于等于max
@SafeHtml字符串是安全的html
@URL字符串是合法的URL
@AssertFalse值必须是false
@AssertTrue值必须是true
@DecimalMax(value=,inclusive=)值必须小于等于(inclusive=true)/小于(inclusive=false)value属性是指定值,可以注解在字符串类型的属性上
@DecimalMin(value=,inclusive=)值必须大于等于(inclusive=true)/大于(inclusive=false)value属性是指定值,可以注解在字符串类型的属性上
@Digits(integer=,fraction=)数字格式检查.Integer指定整数部分的最大长度,fraction指定小数部分的最大长度
@Future值必须是未来的日期
@Past值必须是过去的日期
@Max(value=)值必须大于等于value指定的值,不能注解在字符串上
@Max(value=)值必须大于等于value指定的值,不能注解在字符串上

自定义参数校验

自定义注解接口

package com.imooc.validator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/6-18:52
 **/
//target表示注解在什么上面使用
@Target({ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
//这个注解表示,自定义的注解属于参数校验接口
//validateBy对应的参数就是具体的实现类
@Constraint(validatedBy = MyConstraintValidator.class)
public @interface MyConstraint {
    //下面三个属性是Valid注解必须有的
    //message注解可以有默认值,根据自己需要填写
    String message();
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
}

注解实现类

package com.imooc.validator;

import com.imooc.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/6-18:57
 **/

/**
 * 实现了ConstraintValidator的类会被自动spring注入
 	不需要加@Compnet注解
 	自定义参数校验的最大好处是,可以在参数校验的时候注入你需要的东西进行操作
 */
public class MyConstraintValidator implements ConstraintValidator<MyConstraint,Object> {
    /**
     * 自定义校验规则的好处就是可以在类中注入spring中的bean就行操作
     * @param constraintAnnotation
     */
    //可以按照你的需求注入需要的bean
    @Autowired
    private HelloService helloService;
    /**
     *initialize方法会在校验器第一次被加载时执行,
     *可以进行一些校验器的初始化操作
     */
    @Override
    public void initialize(MyConstraint constraintAnnotation) {
        System.out.println("my validator 初始化");
    }
    /**
     *isvalud方法是校验的主题,具体的校验规则就是在这里写
     *value对应的就是校验时的参数
     *返回true代表校验成功,返回false代表校验失败
     */
    @Override
    public boolean isValid(Object value, ConstraintValidatorContext context) {
        helloService.greeting("sy");
        return false;
    }
}

Service

package com.imooc.service;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/6-19:00
 **/
public interface HelloService {
    String greeting(String name);
}
package com.imooc.service.impl;

import com.imooc.service.HelloService;
import org.springframework.stereotype.Service;

/**
 * @author 沈洋 邮箱:1845973183@qq.com
 * @create 2021/5/6-19:01
 **/
@Service
public class HelloServiceImpl implements HelloService {

    @Override
    public String greeting(String name) {
        System.out.println("Greeting "+name);
        return "hello"+name;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shenyang1026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值