百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Java Validator用法 java validate方法

lipiwang 2024-10-22 15:53 7 浏览 0 评论

Jakarta Bean Validation 旧版本也叫Java Bean Validation,至从Java EE规范移交给Eclipse基金会管理后改成这个名字;主要是规范了参数校验的标准,可以让开发中把你的代码优雅地展现在你的面前,既能达到校验的目的,又能使代码简洁工整;下面使用几个简单的场景介绍一下用法。

Jakarta Bean Validation规范只是接口,具体还是各大开源机构的实现,目前有一些实现版本比如:Hibernate Validator、Apache BVal,Hibernate Validator使用最多,更新也比较及时。目前已经出到7.x.x版本了。7.x.x版本是基于Jakarta Bean Validation 3.0 版本;6.x.x是基于Jakarta/Java Bean Validation 2.0版本,下面基于SpringBoot 案例演示具体用法。

一、Maven 坐标

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

二、验证模型(Model)

package com.codingx.validator.model;
import lombok.Data;
import javax.validation.constraints.*;

@Data
public class User {
    @NotNull(message = "用户名不能为空")
    @Size(message = "用户名长度不满足",max = 8,min = 5)
    private String username;
    @Pattern(message = "性别不对",regexp = "^(男|女){1}#34; )
    private String userSex;
    @Email(message = "邮箱错误")
    private String userEmail;
    @Min(message = "未满十八周岁",value = 18)
    private Integer userAge;
    private String passwd;
    @Pattern(regexp = "^[1][3,4,5,6,7,8,9][0-9]{9}#34;, message = "手机号格式有误")
    private String mobilePhone;
}

三、接口实现类(Controller) Rest类型

package com.codingx.validator.controller;
import com.codingx.validator.model.RestResponse;
import com.codingx.validator.model.User;
import org.springframework.http.MediaType;
import org.springframework.util.Assert;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserRegisterController {
    @PostMapping(value="/register", produces={MediaType.APPLICATION_JSON_VALUE}, consumes={MediaType.APPLICATION_JSON_VALUE})
    public RestResponse<Boolean> register(@RequestBody @Validated User user){
      	//此方法是Springboot 提供的断言校验方法,也挺好用的大家也多用一下
        //毕竟可以很大程度简化代码的复杂度
        Assert.notNull(user.getPasswd(),"密码不能为空");
        Assert.hasLength(user.getPasswd(),"密码不能为空字符..请检查");
        return RestResponse.succ(true,"注册成功");
    }
}

四、定义一个全局异常,毕竟现在都是前后端分离的项目,统一异常可以极大简化处理异常逻辑,又工整、合理

package com.codingx.validator;
import com.codingx.validator.model.RestResponse;
import lombok.extern.slf4j.Slf4j;
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.ValidationException;
/**
 * 全局异常处理
 * 因为参数校验会抛出几种不同的校验异常,索性都捕获了
 * @param <T>
 */
@Slf4j
@RestControllerAdvice
public class GlobalExecptionHandler<T> {
    //方法参数校验异常
    @ExceptionHandler(value= MethodArgumentNotValidException.class)
    public RestResponse<T> validationHandler(MethodArgumentNotValidException e){
        StringBuffer sb = new StringBuffer("");
        for (ObjectError error : e.getBindingResult().getAllErrors()) {
            sb.append(",[").append(error.getDefaultMessage()).append("]");
        }
        return RestResponse.fail(sb.substring(1));
    }
    //校验异常
    @ExceptionHandler(value= ValidationException.class)
    public RestResponse<T> validationHandler(ValidationException e){
        return RestResponse.fail(e.getMessage());
    }
    //不合法参数异常,针对SpringBoot Assert断言抛出的异常
    @ExceptionHandler(value= IllegalArgumentException.class)
    public RestResponse<T> validationHandler(IllegalArgumentException e){
        return RestResponse.fail(e.getMessage());
    }
    //其他异常
    @ExceptionHandler(value=Throwable.class)
    public RestResponse<T> execptionHandler(Throwable e){
        log.error("系统异常",e);
        return RestResponse.fail("系统异常");
    }
}

五、启动类,没啥特别的,就是简单的Springboot启动类

package com.codingx.validator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ValidatorApplication {
    public static void main(String[] args) {
        SpringApplication.run(ValidatorApplication.class, args);
    }
}

六、启动成功后,上我们接口测试工具POSTMAN,下面是一些调试参数,大家可以调整测试一下校验情况。

感觉是不是大大提高了代码的简洁程度,再也不用写一堆NPE判断了。

注:Controller方法中顺便测试了一下Springboot 提供的校验方法,同样也可以达到效果,在一些场景可以简化代码的复杂度。

此演示代码均在gitee有共享,有需要的可以下来来看看。

地址:https://gitee.com/xworkers/codingx-demo

欢迎交流,如有错误,欢迎指正。

相关推荐

前端入门——css 网格轨道详细介绍

上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...

Islands Architecture(孤岛架构)在携程新版首页的实践

一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...

HTML中script标签中的那些属性

HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...

CSS 中各种居中你真的玩明白了么

页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...

CSS样式更改——列表、表格和轮廓

上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...

一文吃透 CSS Flex 布局

原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...

css实现多行文本的展开收起

背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...

css 垂直居中的几种实现方式

前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...

WordPress固定链接设置

WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...

面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿

前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...

3种CSS清除浮动的方法

今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...

2025 年 CSS 终于要支持强大的自定义函数了?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...

css3属性(transform)的一个css3动画小应用

闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...

CSS基础知识(七)CSS背景

一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...

CSS 水平居中方式二

<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...

取消回复欢迎 发表评论: