返回顶部
首页 > 资讯 > 精选 >SpringBoot参数怎么校验
  • 145
分享到

SpringBoot参数怎么校验

2023-06-30 13:06:11 145人浏览 八月长安
摘要

本篇内容主要讲解“SpringBoot参数怎么校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springBoot参数怎么校验”吧!使用传统方式的弊端public String&nb

本篇内容主要讲解“SpringBoot参数怎么校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习springBoot参数怎么校验”吧!

    使用传统方式的弊端

    public String addUser(User user) {     if (user == null || user.getId() == null || user.getAccount() == null || user.getPassword() == null || user.getEmail() == null) {         return "对象或者对象字段不能为空";     }     if (StringUtils.isEmpty(user.getAccount()) || StringUtils.isEmpty(user.getPassword()) || StringUtils.isEmpty(user.getEmail())) {         return "不能输入空字符串";     }     if (user.getAccount().length() < 6 || user.getAccount().length() > 11) {         return "账号长度必须是6-11个字符";     }     if (user.getPassword().length() < 6 || user.getPassword().length() > 16) {         return "密码长度必须是6-16个字符";     }     if (!Pattern.matches("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$", user.getEmail())) {         return "邮箱格式不正确";     }     // 参数校验完毕后这里就写上业务逻辑     return "success"; }

    这样做确实没有什么问题,而且排版也工整,但代码太繁琐了,如果有几十个字段要校验,那这个方法里面将会变得非常臃肿,实在不够优雅。下面我们就来讲讲如何使用最优雅的方式来解决。

    引入依赖

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

    注解说明

    注解说明
    @AssertFalse被注解的元素必须为 false
    @AssertTrue被注解的元素必须为 true
    @DecimalMax(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
    @DecimalMin(value)被注解的元素必须是一个数字,其值必须大于等于指定的最小值
    @Digits (integer, fraction)被注解的元素必须是一个数字,其值必须在可接受的范围内
    @Null被注解的元素必须为空
    @NotNull被注解的元素必须不为空
    @Min(value)被注解的元素必须是一个数字,其值必须大于等于指定的最大值
    @Max(value)被注解的元素必须是一个数字,其值必须小于等于指定的最大值
    @Size(max, min)被注解的元素的长度必须在指定的范围内
    @Past被注解的元素必须是一个过去的日期
    @Future被注解的元素必须是一个未来的日期
    @Pattern(value)被注解的元素必须符合指定的正则表达式

    下面我们以此来在业务中实现

    一、对实体类进行校验

    1、entity

    @Datapublic class User {    @NotNull(message = "用户id不能为空")    private Long id;    @NotNull(message = "用户账号不能为空")    @Size(min = 6, max = 11, message = "账号长度必须是6-11个字符")    private String account;    @NotNull(message = "用户密码不能为空")    @Size(min = 6, max = 11, message = "密码长度必须是6-16个字符")    private String passWord;    @NotNull(message = "用户邮箱不能为空")    @Email(message = "邮箱格式不正确")    private String email;}

    2、controller

    @RestControllerpublic class UserController {    @PostMapping("/addUser")    public void addUser(@RequestBody @Valid User user) {//业务    }}

    3、编写全局统一异常处理

    import org.springframework.validation.ObjectError;import org.springframework.WEB.bind.MethodArgumentNotValidException;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.RestControllerAdvice;import javax.validation.ConstraintViolation;import javax.validation.ConstraintViolationException;import java.util.stream.Collectors;@RestControllerAdvicepublic class ExceptionConfig {        @ExceptionHandler(value = MethodArgumentNotValidException.class)    public String handleValidException(MethodArgumentNotValidException e) {        // 从异常对象中拿到ObjectError对象        ObjectError objectError = e.getBindingResult().getAllErrors().get(0);        // 然后提取错误提示信息进行返回        return objectError.getDefaultMessage();    }        @ExceptionHandler(value = ConstraintViolationException.class)    public String handleConstraintViolationException(ConstraintViolationException e) {        // 从异常对象中拿到ObjectError对象        return e.getConstraintViolations()                .stream()                .map(ConstraintViolation::getMessage)            .collect(Collectors.toList()).get(0);    }}

    然后我们使用apipost测试

    SpringBoot参数怎么校验

    二、针对单个参数进行校验

    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.RestController;import javax.validation.constraints.NotNull;@RestController@Validatedpublic class TestController {    @GetMapping("/test")    public void test(@NotNull(message = "id不能为空") Integer id) {    }}

    然后我们使用apipost测试

    SpringBoot参数怎么校验

    三、分组校验

    场景:在新增时我们需要id为空,但修改时我们又需要id不为空,总不可能搞两个类吧,这时候分组校验的用处就来了

    1、entity

    import lombok.Data;import javax.validation.constraints.Email;import javax.validation.constraints.NotNull;import javax.validation.constraints.Size;@Datapublic class User {    public interface Insert{    }    public interface Update{    }    @NotNull(message = "用户id不能为空",groups = Update.class)    @Null(message = "用户id必须为空",groups = Integer.class)    private Long id;    private String account;    private String password;    private String email;}

    2、controller

    @PostMapping("/add")public void add(@RequestBody @Validated(User.Insert.class) User user) {}

    添加时就用User.Insert.class,修改时就用User.Update.class

    四、自定义分组校验

    场景:当type为1时,需要参数a不为空,当type为2时,需要参数b不为空。

    1、entity

    import com.example.demo.provider.CustomSequenceProvider;import lombok.Data;import org.hibernate.validator.group.GroupSequenceProvider;import javax.validation.constraints.NotEmpty;import javax.validation.constraints.Pattern;@Data@GroupSequenceProvider(value = CustomSequenceProvider.class)public class CustomGroup {        @Pattern(regexp = "[A|B]" , message = "类型不必须为 A|B")    private String type;        @NotEmpty(message = "参数A不能为空" , groups = {WhenTypeIsA.class})    private String paramA;        @NotEmpty(message = "参数B不能为空", groups = {WhenTypeIsB.class})    private String paramB;        public interface WhenTypeIsA {    }        public interface WhenTypeIsB {    }}

    2、CustomSequenceProvider

    import com.example.demo.controller.CustomGroup;import org.hibernate.validator.spi.group.DefaultGroupSequenceProvider;import java.util.ArrayList;import java.util.List;public class CustomSequenceProvider implements DefaultGroupSequenceProvider<CustomGroup> {    @Override    public List<Class<?>> getValidationGroups(CustomGroup fORM) {        List<Class<?>> defaultGroupSequence = new ArrayList<>();        defaultGroupSequence.add(CustomGroup.class);        if (form != null && "A".equals(form.getType())) {            defaultGroupSequence.add(CustomGroup.WhenTypeIsA.class);        }        if (form != null && "B".equals(form.getType())) {            defaultGroupSequence.add(CustomGroup.WhenTypeIsB.class);        }        return defaultGroupSequence;    }}

    3、controller

    @PostMapping("/add")public void add(@RequestBody @Validated CustomGroup user) {}

    五、自定义校验

    虽然官方提供的校验注解已经满足很多情况了,但还是无法满足我们业务的所有需求,比如校验手机号码,下面我就以校验手机号码来做一个示例。

    1、定义校验注解

    @Target({ElementType.FIELD})@Retention(RetentionPolicy.RUNTIME)@Constraint(validatedBy = PhoneValidator.class)public @interface Phone {    String message() default "手机号码格式有误";    Class<?>[] groups() default {};    Class<? extends Payload>[] payload() default {};}

    注:groups和payload是必须要写的,Constraint是使用哪个类来进行校验。

    2、实现注解

    import javax.validation.ConstraintValidator;import javax.validation.ConstraintValidatorContext;import java.util.regex.Pattern;public class PhoneValidator implements ConstraintValidator<Phone, Object> {    @Override    public boolean isValid(Object telephone, ConstraintValidatorContext constraintValidatorContext) {        String pattern = "^1[3|4|5|6|7|8|9]\\d{9}$";        return Pattern.matches(pattern, telephone.toString());    }}

    最后直接用到参数前面或者实体类变量上面即可。

    六、嵌套校验

    当某个对象中还包含了对象需要进行校验,这个时候我们需要用嵌套校验。

    @Datapublic class TestAA {    @NotEmpty(message = "id不能为空")    private String id;    @NotNull    @Valid    private Job job;    @Data    public class Job {        @NotEmpty(message = "content不能为空")        private String content;    }}

    七、快速失败

    Spring Validation默认会校验完所有字段,然后才抛出异常。可以通过配置,开启Fali Fast模式,一旦校验失败就立即返回。

    import org.hibernate.validator.HibernateValidator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.validation.Validation;import javax.validation.Validator;import javax.validation.ValidatorFactory;@Configurationpublic class FailFastConfig {    @Bean    public Validator validator() {        ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)                .configure()                // 快速失败模式                .failFast(true)                .buildValidatorFactory();        return validatorFactory.getValidator();    }}

    注意事项

    SpringBoot 2.3.x 移除了validation依赖需要手动引入依赖。

    到此,相信大家对“SpringBoot参数怎么校验”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    --结束END--

    本文标题: SpringBoot参数怎么校验

    本文链接: https://lsjlt.com/news/329366.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • SpringBoot参数怎么校验
      本篇内容主要讲解“SpringBoot参数怎么校验”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“SpringBoot参数怎么校验”吧!使用传统方式的弊端public String&nb...
      99+
      2023-06-30
    • springboot参数格式怎么校验
      这篇文章主要介绍“springboot参数格式怎么校验”,在日常操作中,相信很多人在springboot参数格式怎么校验问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot参数格式怎么校验”的疑...
      99+
      2023-06-08
    • SpringBoot怎么进行参数校验
      这篇文章主要讲解了“SpringBoot怎么进行参数校验”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringBoot怎么进行参数校验”吧!介绍在日常的接口开发中,为了防止非法参数对业务...
      99+
      2023-06-30
    • springboot 中怎么校验参数格式
      本篇文章给大家分享的是有关springboot 中怎么校验参数格式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。springboot 参数格式校验@Validated 字面意思...
      99+
      2023-06-20
    • SpringBoot怎么使用validation做参数校验
      这篇文章主要介绍了SpringBoot怎么使用validation做参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot怎么使用validation做参数校验文章都会有所收获,下面我们一起...
      99+
      2023-06-30
    • SpringBoot参数校验之@Valid怎么使用
      这篇文章主要介绍“SpringBoot参数校验之@Valid怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot参数校验之@Valid怎么使用”文章能帮助大家解决问题。依赖&l...
      99+
      2023-07-02
    • SpringBoot集成Validation参数校验
      本文实例为大家分享了SpringBoot集成Validation参数校验的具体代码,供大家参考,具体内容如下 1、依赖 SpringBoot在web启动器中已经包含validator...
      99+
      2024-04-02
    • SpringBoot参数校验Validator框架怎么使用
      这篇“SpringBoot参数校验Validator框架怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“SpringB...
      99+
      2023-07-02
    • SpringBoot接口怎么对参数进行校验
      今天小编给大家分享一下SpringBoot接口怎么对参数进行校验的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是不优雅的...
      99+
      2023-07-02
    • SpringBoot中怎么实现请求参数校验
      在Spring Boot中,可以使用JSR 303规范中的注解来实现请求参数的校验。具体步骤如下: 在Controller类中的请...
      99+
      2024-03-08
      SpringBoot
    • springboot 参数格式校验操作
      springboot 参数格式校验 @Validated 字面意思校验 @RequestBody 该注解不用多说,意思是接收为json格式的参数 @Validated 字面意...
      99+
      2024-04-02
    • SpringBoot参数校验的方法总结
      目录一、前言二、注解介绍三、添加依赖四、创建用于校验的实体类五、写一个测试用的接口六、在实体类中添加注解七、在 controller 方法中添加 Validated 注解八、添加全局...
      99+
      2024-04-02
    • SpringBoot参数校验Validator框架详解
      目录SpringBoot 如何进行参数校验1.集成Validator校验框架1.1. 引入依赖包1.2. 定义要参数校验的实体类1.3. 定义校验类进行测试1.4. 测试结果11.5...
      99+
      2024-04-02
    • Springboot 如何使用BindingResult校验参数
      目录使用BindingResult校验参数1、创建一个参数对象2、controller控制层写参数接收的入口3、传入参数和控制台打印结果4、常用校验注解BindingResult 作...
      99+
      2024-04-02
    • 怎么实现java开发SpringBoot参数校验过程
      这篇文章主要讲解了“怎么实现java开发SpringBoot参数校验过程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现java开发SpringBoot参数校验过程”吧!为什么需要参数...
      99+
      2023-06-25
    • SpringBoot使用validation做参数校验说明
      目录1.添加依赖直接添加 hibernate-validator添加spring-boot-starter-validation添加spring-boot-starter-...
      99+
      2024-04-02
    • springboot接口参数校验JSR303的实现
      目录一、在controller接口处理校验异常二、统一异常处理三、错误码枚举类四、自定义参数校验注解在 javax.validation.constraints包中定义了非常多的校验...
      99+
      2022-11-13
      springboot接口参数校验JSR303 springboot JSR303
    • Springboot怎么使用filter对request body参数进行校验
      这篇文章主要为大家展示了“Springboot怎么使用filter对request body参数进行校验”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Springboot怎么使用fil...
      99+
      2023-06-29
    • SpringBoot参数校验的最佳实战教程
      目录前言hibernate-validator基本使用 引入依赖 编写需要验证对象 验证对象属性是否符合要求 验证规则 空/非空验证bool时间数学 字符串模板正则 SpringBo...
      99+
      2024-04-02
    • SpringBoot各种参数校验的实例教程
      目录 简单使用引入依赖requestBody参数校验requestParam/PathVariable参数校验统一异常处理进阶使用分组校验嵌套校验集合校验自定义校验编程式校...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作