首页 > 其他分享 >spring-boot-starter-validation数据校验

spring-boot-starter-validation数据校验

时间:2023-06-07 22:26:11浏览次数:50  
标签:spring boot annotation org import message validation public

依赖

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

 

bean

import boot.annotation.Status;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.*;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class RegistryUser {
    @NotBlank(message = "用户名不能为空")
    private String userName;

    @NotBlank(message = "密码不能为空")
    @Length(min = 6, max = 20, message = "密码长度在6-20之间")
    private String password;

    @Min(value = 0, message = "年龄最小为0")
    @Max(value = 100, message = "年龄最大为100")
    private Integer age;

    @NotBlank(message = "邮箱不能为空")
    @Email(message = "邮箱格式不正确")
    private String email;

    private Boolean admin;

    @Pattern(regexp = "^1[0-9]{10}$", message = "手机号码格式错误")
    @NotBlank(message = "手机号不能为空")
    private String phone;

    @Status(statusType = {"1","2"})//自定义的注解校验
    private Integer status;

}

自定义注解@Status

import boot.config.StatusValidator;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

@Target({ElementType.FIELD,ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StatusValidator.class})//约束条件
public @interface Status {
    String[] statusType() default {};

    String  message() default "状态传递有误";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
}
/**
 * 注解内的 Class<?>[] groups() default {};
 * Class<? extends Payload>[] payload() default  {}; 不要忘记,且名称固定,否则使用时报错
 *javax.validation.ConstraintDefinitionException: HV000074: com.yoona.MyAnnotation contains Constraint annotation, but does not contain a payload(或者为groups) parameter.
 *
 */

StatusValidator类自定义校验逻辑

import boot.annotation.Status;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.List;

public class StatusValidator implements ConstraintValidator<Status,Integer> {

    private List<String> typeStatus;

    @Override
    public void initialize(Status constraintAnnotation) {
        typeStatus = Arrays.asList(constraintAnnotation.statusType());
        ConstraintValidator.super.initialize(constraintAnnotation);
    }

    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext constraintValidatorContext) {
        if(value != null){
            if(!typeStatus.contains(String.valueOf(value))){
                return false;
            }
        }
        return true;
    }
}

使用全局捕获参数校验异常

import boot.utils.Result;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


@RestControllerAdvice
public class GlobalExceptionHandler {
    //全局异常处理
    @ExceptionHandler(Exception.class)
    public Result error(Exception e){
        e.printStackTrace();
        //return Result.fail("系统出现异常啦");
        return Result.fail(e.getMessage());
    }

    //添加参数校验异常处理
    @ExceptionHandler(MethodArgumentNotValidException.class) //BindException
    public Result bindExceptionHandler(MethodArgumentNotValidException e){
        e.printStackTrace();
        return Result.fail(e.getBindingResult().getAllErrors().get(0).getDefaultMessage());
    }

}

 

测试代码controller

 

import boot.controller.beans.RegistryUser;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

@RestController
@Validated//在此处添加注解,则里面的get请求无需再添加Valid注解
public class RegistryController {

    //Controller中必须加上@Valid注解校验才生效
    @PostMapping("registryUser")
    public String registryUser(@RequestBody @Valid RegistryUser registryUser){
        System.out.println(registryUser.getUserName());
        return "注册成功";
    }

    @GetMapping("login")
    public String login(@NotBlank(message = "姓名不能为空") @Pattern(regexp = "\\w+",message = "姓名只能数字字母下划线格式") String name){
        System.out.println(name);
        return "登录成功";
    }
}

 

post请求

 

 

 

get请求

 

注解校验

 

标签:spring,boot,annotation,org,import,message,validation,public
From: https://www.cnblogs.com/ixtao/p/17464730.html

相关文章

  • Spring Cloud微服务
    SpringCloud微服务SpringCloud是一个用于开发分布式系统的框架,它基于SpringBoot构建。SpringCloud提供了一些工具和库,使得开发分布式系统变得更加容易。微服务架构微服务架构是一种软件架构风格,其中应用程序被拆分成小型服务,这些服务可以独立部署、扩展和维护。每个服务都是在......
  • JAVA的springboot+vue企业客户信息反馈平台,附源码+数据库+文档+PPT
    1、项目介绍企业客户信息反馈平台能够通过互联网得到广泛的、全面的宣传,让尽可能多的用户了解和熟知企业客户信息反馈平台的便捷高效,不仅为客户提供了服务,而且也推广了自己,让更多的客户了解自己。对于企业客户信息反馈而言,若拥有自己的平台,通过平台得到更好的管理,同时提升了形象......
  • 【深入浅出Spring原理及实战】「夯实基础系列」360全方位分析和探究SpringMVC的核心原
    SpringMVC简介SpringWebMVC是一种基于Java的轻量级Web框架,它实现了WebMVC设计模式,使用VC架构模式的思想将web层进行职责解耦。这种请求驱动类型的框架使用请求-响应模型,旨在简化Web开发过程。使用SpringWebMVC,我们可以更加高效地开发Web应用程序,而不必为了每个接口编写一个Ser......
  • SpringMVC参数接收与数据响应
    SpringMVC如何接受请求参数(普通类型参数/对象类型参数/数组/json数据等)1、普通类型参数(1)在可以在方法参数上使用@RequestParam注解来绑定请求参数,此注解允许指定请求参数的名称,以及是否是必须传的参数。@RequestMapping("/example")publicStringexampleMethod(@RequestPara......
  • 去除spring security的默认登录页
    在使用springsecurity时会默认带入一个登录页,使用SSO单点登录的时候也会跳出这个页面,我们的项目一般都会有自己的登录页面,所以这个默认页面其实是没什么用的在过滤器配置文件里面加上下面的代码,就可以把这个默认页面移除了@BeanpublicWebSecurityConfigurerAdapter......
  • spring cloud gateway网关(一)之网关路由
    1、gateway相关介绍在微服务架构中,系统往往由多个微服务组成,而这些服务可能部署在不同机房、不同地区、不同域名下。这种情况下,客户端(例如浏览器、手机、软件工具等)想要直接请求这些服务,就需要知道它们具体的地址信息,例如IP地址、端口号等。这种客户端直接请求服务的方式存在很......
  • springmvc后端响应给前端
    controllerpackagecom.bh.controller;importcom.bh.po.User;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.ModelAttribute;importorg.springframework.web.bind.annotation.RequestMapping;importorg.spring......
  • SpringBoot入门
    HelloWorld需求:浏览器发送/hello请求,响应Hello,SpringBoot创建springboot项目主程序类@SpringBootApplicationpublicclassBoot01HelloworldApplicationpublicstaticvoidmain(String[]args){SpringApplication.run(Boot01HelloworldApplication.cl......
  • 手写spring框架
    Spring IoC容器的实现原理:工厂模式 + 解析XML + 反射机制。我们给自己的框架起名为:myspring(我的春天)1. 第一步:创建模块myspring 62采用Maven方式新建Module:myspring打包方式采用jar,并且引入dom4j和jaxen的依赖,因为要使用它解析XML文件,还有junit依赖。<?xmlversion="1.0"en......
  • 测试我们手写的myspring框架
    引入我们的myspring框架<!--用myspring框架需要引入框架--><dependency><groupId>org.myspringframework</groupId><artifactId>course15</artifactId><version>1.0.0</version>......