JSR303字段校验

目录

JSR303校验

一.jsr303依赖原有注解使用

1.添加依赖包

2. 然后定义Validator

二.自定义注解

1. 自定义身份证校验 注解

2. 然后自定义Validator

3. 使用自定义的注解

4.使用groups的校验

5.restful风格用法


JSR303校验

一.jsr303依赖原有注解使用

1.添加依赖包

        <!--jsr 303-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <!-- hibernate validator-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>5.2.0.Final</version>
        </dependency>

2. 然后定义Validator

@NotNull:不能为null,但可以为empty(""," "," ")

@NotEmpty:不能为null,而且长度必须大于0 (" "," ")

@NotBlank:只能作用在String上,不能为null,而且调用trim()后,长度必须大于0("test") 即:必须有实际字符

1. @Validated 声明要检查的参数

这里我们在控制器层进行注解声明

    /**
     * jsr303校验+分组
     * @param validEntity
     */
    @PostMapping("/valid")
    public void  valid(@RequestBody @Validated(Update.class) ValidEntity validEntity){
        System.out.println(validEntity.toString());
    }

    @PostMapping("/insert")
    public void  insert(@RequestBody @Validated(Create.class) ValidEntity validEntity){
        System.out.println(validEntity.toString());
    }

2. 对参数的字段进行注解标注

@Data
public class ValidEntity {

    @NotBlank(message = "用户名不能为空",groups = {Create.class})
    @Length(max = 10, message = "用户名不能超过10个字符")
    private String userName;


    @NotNull(message = "用户id不能为空" ,groups = {Update.class})
    private Long userId;


    @NotBlank(message = "身份证号不能为空",groups = {Create.class})
    @IdentityCardNumber(message = "身份证号码错误",groups = {Create.class})
    private String card;

}

3. 在全局校验中增加校验异常

package com.example.demo.mvc.exceptionHandler;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.NoHandlerFoundException;

import javax.validation.ConstraintViolationException;
import javax.validation.ValidationException;


/**
 * @author zsy
 * @ClassName: GlobalExceptionHandler
 * @Description: 全局异常处理器
 * @date 2021/9/09 10:57
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
 
    private Logger logger = LoggerFactory.getLogger(getClass());
 
    private static int DUPLICATE_KEY_CODE = 1001;
    private static int PARAM_FAIL_CODE = 1002;
    private static int VALIDATION_CODE = 1003;
 
    /**
     * 处理自定义异常
     */

 
    /**
     * 方法参数校验
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public RspDTO handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(PARAM_FAIL_CODE, e.getBindingResult().getFieldError().getDefaultMessage());
    }
 
    /**
     * ValidationException
     */
    @ExceptionHandler(ValidationException.class)
    public RspDTO handleValidationException(ValidationException e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(VALIDATION_CODE, e.getCause().getMessage());
    }
 
    /**
     * ConstraintViolationException
     */
    @ExceptionHandler(ConstraintViolationException.class)
    public RspDTO handleConstraintViolationException(ConstraintViolationException e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(PARAM_FAIL_CODE, e.getMessage());
    }
 
    @ExceptionHandler(NoHandlerFoundException.class)
    public RspDTO handlerNoFoundException(Exception e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(404, "路径不存在,请检查路径是否正确");
    }
 
    @ExceptionHandler(DuplicateKeyException.class)
    public RspDTO handleDuplicateKeyException(DuplicateKeyException e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(DUPLICATE_KEY_CODE, "数据重复,请检查后提交");
    }
 
 
    @ExceptionHandler(Exception.class)
    public RspDTO handleException(Exception e) {
        logger.error(e.getMessage(), e);
        return new RspDTO(500, "系统繁忙,请稍后再试");
    }
}

4.测试

二.自定义注解

1. 自定义身份证校验 注解

@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = IdentityCardNumberValidator.class)
public @interface IdentityCardNumber {
 
    String message() default "身份证号码不合法";
 
    Class<?>[] groups() default {};
 
    Class<? extends Payload>[] payload() default {};
}

2. 然后自定义Validator

这个是真正进行验证的逻辑代码:

public class IdentityCardNumberValidator implements ConstraintValidator<IdentityCardNumber, Object> {
 
    @Override
    public void initialize(IdentityCardNumber identityCardNumber) {
    }
 
    @Override
    public boolean isValid(Object o, ConstraintValidatorContext constraintValidatorContext) {
        return IdCardValidatorUtils.isValidate18Idcard(o.toString());
    }
}
public class IdentityUtils {

    public static boolean isIdentity(String card){
        if (card.length() == 18 || card.length() == 16) {
            return true ;
        }
        return false;
    }
}

3. 使用自定义的注解

@NotBlank(message = "身份证号不能为空",groups = {Create.class})
@IdentityCardNumber(message = "身份证号码错误",groups = {Create.class})
private String card;

4.使用groups的校验

1.先定义groups的分组接口Create和Update

import javax.validation.groups.Default;
 
public interface Create extends Default {
}
 
import javax.validation.groups.Default;
 
public interface Update extends Default{
}

2.再在需要校验的地方@Validated声明校验组

@NotNull(message = "用户id不能为空", groups = Update.class)
private Long userId;
@PostMapping("/valid")
public void  valid(@RequestBody @Validated(Update.class) ValidEntity validEntity){
    System.out.println(validEntity.toString());
}

注意:在声明分组的时候尽量加上 extend javax.validation.groups.Default 否则,在你声明@Validated(Update.class)的时候,就会出现你在默认没添加groups = {}的时候的校验组@Email(message = "邮箱格式不对"),会不去校验,因为默认的校验组是groups = {Default.class}.

5.restful风格用法

在多个参数校验,或者@RequestParam 形式时候,需要在controller上加注@Validated

@RestController
@RequestMapping("user/")
@Validated
public class UserController extends AbstractController {}
@GetMapping("/get")
public RspDTO getUser(@RequestParam("userId") @NotNull(message = "用户id不能为空") Long userId) {
    User user = userService.selectById(userId);
    if (user == null) {
        return new RspDTO<User>().nonAbsent("用户不存在");
    }
    return new RspDTO<User>().success(user);
}

好了,jsr303校验基本流程就是这样了,有什么不明白的可以私信我哦。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值