Java如何实现优雅的参数校验

一、引子

要对方法的参数进行校验,最简单暴力的写法是这个样子:

    public static void utilA(String a,BigDecimal b){        if (StringUtils.isEmpty(a)){            System.out.println("a不可为空");            return;        }        if (b == null){            System.out.println("b不可为空");            return;        }        if (b.compareTo(BigDecimal.ZERO) != 1){            System.out.println("b的取值范围不正确");            return;        }        System.out.println("do something");    }

登录后复制

这样做从功能角度来说一点问题也没有。

但是从代码的长期维护性上来说,代码复用率低,校验规则一旦多起来很难维护,而且怎么看怎么显得笨拙,对于有一点追求的工程师来说,这么一大坨还是挺难接受的。

虽然有一些诸如 Preconditions(com.google) 的解决方案,但很难适应所有的场景,用起来也没到非常得心应有的地步。

二、如何优雅地校验参数

Spring官方推荐的,语义清晰的优雅的方法级别校验(入参校验、返回值校验)

立即学习“Java免费学习笔记(深入)”;

2.1 官方指导意见

Spring官方在SpringBoot文档中,关于参数校验(Validation)给出的解决方案是这样的:

@Service@Validatedpublic class MyBean {     public Archive findByCodeAndAuthor(@Size(min = 8, max = 10) String code,            Author author) {        ...    } }

登录后复制

Spring Boot 官网文档 《37. Validation》

也就是说,使用 JSR-303 规范,直接利用注解进行参数校验。

(JSR-303 是 JAVA EE 6 中的一项子规范,叫做 Bean Validation,官方参考实现是 Hibernate Validator)

2.2 注解用法说明

2.2.1.注解简介

对于简单类型参数(非Bean),直接在参数前,使用注解添加约束规则。注解如下所示:

@AssertTrue / @AssertFalse 

验证适用字段:boolean

注解说明:验证值是否为true / false

@DecimalMax / @DecimalMin

验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解说明:验证值是否小于或者等于指定的小数值,要注意小数存在精度问题

@Digits

验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解说明:验证值的数字构成是否合法

属性说明:integer:指定整数部分的数字的位数。fraction: 指定小数部分的数字的位数。

@Future / @Past

验证适用字段:Date,Calendar

注解说明:验证值是否在当前时间之后 / 之前

属性说明:公共

@Max / @Min

验证适用字段:BigDecimal,BigInteger,String,byte,short,int,long

注解说明:验证值是否小于或者等于指定的整数值

属性说明:公共

注意事项:建议使用在Stirng,Integer类型,不建议使用在int类型上,因为表单提交的值为“”时无法转换为int

@NotNull / @Null

验证适用字段:引用数据类型

注解说明:验证值是否为非空 / 空

属性说明:公共

@NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格. 

@NotEmpty 检查约束元素是否为Null或者是EMPTY.

@NotBlank 与 @NotEmpty 的区别:空格(” “)对于 NotEmpty 是合法的,而 NotBlank 会抛出校验异常

@Pattern

验证适用字段:String

注解说明:验证值是否配备正则表达式

属性说明:regexp:正则表达式flags: 指定Pattern.Flag 的数组,表示正则表达式的相关选项。

@Size

验证适用字段:String,Collection,Map,数组

注解说明:验证值是否满足长度要求

属性说明:max:指定最大长度,min:指定最小长度。

@Length(min=, max=):专门应用于String类型

@Valid

验证适用字段:递归的对关联对象进行校验

注解说明:如果关联对象是个集合或者数组,那么对其中的元素进行递归校验,如果是一个map,则对其中的值部分进行校验(是否进行递归验证)

属性说明:无

@Range(min=, max=) 被指定的元素必须在合适的范围内 

@CreditCardNumber信用卡验证 

@Email 验证是否是邮件地址,如果为null,不进行验证,算通过验证。 

@URL(protocol=,host=, port=,regexp=, flags=)

2.2.2使用

1.引入依赖

                     org.hibernate.validator            hibernate-validator            6.1.5.Final        

登录后复制

2.在对应字段上添加注解,方法被调用时,如果传入的实际参数与约束规则不符,会直接抛出 ConstraintViolationException ,表明参数校验失败。

import javax.validation.constraints.Max;import javax.validation.constraints.Min;import javax.validation.constraints.NotEmpty; /** * @Author: wangxia * @Date: 2021/10/20 16:30 */public class TestPerson {     @NotEmpty(message = "用户名不能为空")    private String username;     @Min(value = 0,message = "年龄不能小于0岁")    @Max(value =150,message = "年龄不能大于150岁")    private int age;     public String getUsername() {        return username;    }     public void setUsername(String username) {        this.username = username;    }     public int getAge() {        return age;    }     public void setAge(int age) {        this.age = age;    }}

登录后复制

3..对于Bean类型的参数,在Bean内部的各个字段上面追加约束注解,然后在方法的参数前面添加 @Validated或@Valid注解即可。示例:

@RequestMapping("/")@RestControllerpublic class TestValidatController {     @PostMapping("/testValid")    public String testValid(@Validated @RequestBody TestPerson testPerson){        return "测试成功";    } }

登录后复制

4.优雅捕获异常,这一步可以省略,但是请求时会直接返回,400的异常提示,不太优雅。

@ControllerAdvice@ResponseBody public class MethodArgumentNotValidHandel {      @ExceptionHandler(value=MethodArgumentNotValidException.class)    public JSONObject MethodArgumentNotValidHandler(HttpServletRequest request,                                                    MethodArgumentNotValidException exception) throws Exception    {        JSONObject result=new JSONObject();        result.put("code","fail");        JSONObject errorMsg=new JSONObject();        for (FieldError error : exception.getBindingResult().getFieldErrors()) {            errorMsg.put(error.getField(),error.getDefaultMessage());        }        result.put("msg",errorMsg);        return result;    } }

登录后复制

添加优雅捕获的异常提示:

Java如何实现优雅的参数校验

未添加优雅捕获的异常提示:

Java如何实现优雅的参数校验

以上就是Java如何实现优雅的参数校验的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2626116.html

(0)
上一篇 2025年3月7日 00:49:20
下一篇 2025年3月7日 00:49:31

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Java之SpringBoot怎么实现基本增删改查

    根据上图所示,idea中我们有7个比较重要的模块需要建立 (1)controller包:如果学习过或者对SpringMVC有所了解的小伙伴,肯定知道,controller是控制层,相当于我们的接收浏览器信息并响应发送相关信息的地方,具体的还…

    2025年3月7日 编程技术
    200
  • Java SpringMVC数据响应实例分析

    1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。  返回带有前缀的字符串: 转发:   forward:/WEB-INF/views/index.jsp 重定向:   redirect:/index…

    2025年3月7日
    200
  • Java反射怎么定义和使用

    定义 在java程序运行期间动态获取和操作类、方法、属性等元素的能力被称为java反射。它使得我们可以在程序运行时获取一个类的信息,并对其进行操作,这极大地扩展了java语言的灵活性和可扩展性。 在Java中,每个类都有一个对应的Class…

    编程技术 2025年3月7日
    200
  • Java Agent怎么用

    Java Agent 技术简介 java agent 直译为 java 代理,也常常被称为 java 探针技术。 Java Agent 这种技术是在 JDK1.5 引入的,可以在运行时动态修改 Java 字节码。Java 中的类编译后形成字…

    2025年3月7日 编程技术
    200
  • Java Spring怎么实现定时任务

    java实现定时任务 jdk自带的库中,有两种方式可以实现定时任务,一种是timer,另一种是scheduledthreadpoolexecutor。 Timer+TimerTask 创建一个Timer就创建了一个线程,可以用来调度Time…

    2025年3月7日
    200
  • Java 中的异构系统集成和数据集成技术

    随着大数据和云计算技术的发展,企业和组织面临着多种异构系统的集成和数据交换的挑战。在这个背景下,java 的异构系统集成和数据集成技术得到了广泛的应用和发展。本文将从异构系统集成和数据集成的概念、java 中异构系统集成和数据集成的原理和应…

    编程技术 2025年3月7日
    200
  • Java 中的移动支付和金融科技技术

    随着人们生活方式和消费习惯的变化,移动支付和金融科技在全球范围内正在迅速发展。作为一种新兴的支付方式,移动支付已经成为了人们生活中不可或缺的一部分。java 作为一种强大的编程语言,在移动支付和金融科技领域也有着重要的作用。 移动支付的核心…

    编程技术 2025年3月7日
    200
  • Java 中的区块链和数字货币技术

    区块链和数字货币技术是如今最热门的技术之一,文章将对java中的区块链和数字货币技术进行探讨。 区块链是一个由多个块组成的链式结构网络,每个块存储着许多交易信息。 在Java中,区块链可以通过使用Spring Boot和Web3J等框架来实…

    编程技术 2025年3月7日
    200
  • Java语言中的微信小程序开发介绍

    微信小程序是一种轻量级的应用程序,可以在微信平台上运行,不需要下载安装,方便快捷。java语言作为一种广泛应用于企业级应用开发的语言,也可以用于微信小程序的开发。 在Java语言中,可以使用Spring Boot框架和第三方工具包来开发微信…

    编程技术 2025年3月7日
    200
  • Java语言中的云计算应用介绍

    云计算是近年来广受关注和推崇的一种计算模式,它通过集成计算和存储资源,并通过互联网提供这些资源给用户,为企业和个人提供更加灵活、可扩展的it服务。java作为一种广泛应用于企业级开发的编程语言,也成为了云计算应用中常见的语言之一。在这篇文章…

    编程技术 2025年3月7日
    200

发表回复

登录后才能评论