Spring Framework 5.0:组件的验证(Bean验证)、Hibernate Validator入门

Spring Bean生命周期深度解析:从源码到线上故障排查 Spring Bean生命周期是Java工程师理解Spring框架的核心基础概念,它定义了Bean从定义、实例化、依赖注入、初始化回调到销毁的完整时序过程。其底层原理涉及BeanDefinition注册、三级缓存解决循环依赖、BeanPostProcessor扩展点、AOP代理织入时机等关键机制。该模型不仅支撑@Transactional、@Async、@EventListener等核心功能的正确性,更直接影响应用启动稳定性、资源释放安全性和云原生就绪状态。掌握其执行阶段(如postProcessBefor 阅读详情

组件的验证(Bean验证)

package SpringLean.Users;

import org.springframework.beans.factory.annotation.Autowired;

// 这是我们的 用户实体类
public class UserEntity {
    private int user_id;
    private String user_name;
    private int age;

    public UserEntity(int user_id, String user_name, int age) {
        this.user_id = user_id;
        this.user_name = user_name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    @Autowired
    public String toString(){
        return "用户信息:" + this.getUser_id() + ":" + this.getUser_name() + ":" + this.getAge();
    }
}

比如我们有这么一个用户实体类,其中的属性往往是需要有个验证的:age不能大于多少,user_name不能包含非法字符。
当然可以在setter方法里来判断,只不过显得B格有点儿低了。

Spring框架有没有什么高级的处理验证的方式?
https://docs.spring.io/spring/docs/5.0.1.BUILD-SNAPSHOT/spring-framework-reference/core.html#validator

package SpringLean.Users;


import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

// 用户验证器

@Component
public  class UserValidator implements Validator {

    public boolean supports(Class<?> aClass) {
        // 是 UserEntity类 才验证
        return UserEntity.class.equals(aClass);
    }

    public void validate(Object o, Errors errors) {
        // 把o对象强制转化为UserEntity对象
        UserEntity userEntity = (UserEntity)o;

        // 开始验证
        if (userEntity.getAge() < 0) {
            errors.reject("age", "年龄不能小于0");
        } else if (userEntity.getAge() > 110) {
            errors.reject("age", "年龄不能不能大于110");
        }
    }
}

写一个验证器类。

如何把这个验证器类和用户实体类相关联?
https://docs.spring.io/spring/docs/5.0.1.BUILD-SNAPSHOT/spring-framework-reference/core.html#validation-beanvalidation

还在我们的测试类MyTest中来演示:

@Component("MyTest")
public class MyTest {
    @Autowired
    UserValidator userValidator; // 加载UserValidator类

    // 写个方法用于检测
    public void showUser(UserEntity userEntity){
        // 把UserEntity和UserValidator关联后,执行验证
        DataBinder dataBinder = new DataBinder(userEntity);
        dataBinder.setValidator(this.userValidator);
        dataBinder.validate();

        if (dataBinder.getBindingResult().hasErrors()){
            // 验证有错误
            List<ObjectError> errors = dataBinder.getBindingResult().getAllErrors();
            for (ObjectError error : errors){
                System.out.println(error.getDefaultMessage());
            }
        }else{
            System.out.println("数据验证通过");
        }
    }
}

上面代码可以看出:在showUser()方法接收一个UserEntity类对象,在该方法中进行了和验证类的关联,并且做了验证的判断处理。

来到入口文件,实例化MyTest类并调用相关方法测试:

    public static void main(String[] args) throws Exception{

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("SpringLean");
        context.refresh();

        MyTest myTest = context.getBean("MyTest",MyTest.class);

        UserEntity userEntity = new UserEntity(1,"zhangsan",120);
        myTest.showUser(userEntity);
    }

执行程序,控制台输出:

年龄不能不能大于110

思考:
如果我们有很多实体类,是否都需要一个个创建Validator来对期验证?

Hibernate Validator入门

JSR-303 Bean Validation API
https://docs.spring.io/spring/docs/5.0.1.BUILD-SNAPSHOT/spring-framework-reference/core.html#validation-beanvalidation-overview
这是一个规范,并不是Spring特有的,Spring框架集成了Bean Validation 1.0 (JSR-303) / 1.1 (JSR-349) / 2.0(JSR-380)

关于Bean Validation具体可以看:
http://beanvalidation.org/

目前实现该规范的有Hibernate Validator,文档地址:
http://hibernate.org/validator/

1、使用maven安装。

在pom.xml文件里:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.7.Final</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.el</artifactId>
    <version>3.0.1-b08</version>
</dependency>

2、改造我们的用户实体类

package SpringLean.Users;

import org.springframework.beans.factory.annotation.Autowired;

import javax.validation.constraints.Max;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;

// 这是我们的 用户实体类
public class UserEntity {
    private int user_id;
    @NotNull
    private String user_name;

    @NotNull
    @Min(value = 10, message = "年龄不能小于10")
    @Max(value = 110, message = "年龄不能大于110")
    private int age;

    public UserEntity(int user_id, String user_name, int age) {
        this.user_id = user_id;
        this.user_name = user_name;
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getUser_id() {
        return user_id;
    }

    public void setUser_id(int user_id) {
        this.user_id = user_id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    @Autowired
    public String toString(){
        return "用户信息:" + this.getUser_id() + ":" + this.getUser_name() + ":" + this.getAge();
    }
}

注意,我们在几个属性上打上了注解。

3、注册Bean

package SpringLean;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.validation.Validator;
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;

@Configuration  // 表明这是一个配置类
public class MyConfig {

    @Bean
    public Validator LocalValidator(){
        return new LocalValidatorFactoryBean();
    }
}

关于注册Bean的方式,这里还是使用的注解的方式,关于这部分知识,可以查看:
http://blog.youkuaiyun.com/github_26672553/article/details/78793707

4、然后我们肯定知道在MyTest类中,就就要验证类换掉了

 @Autowired
Validator LocalValidator;
dataBinder.setValidator(this.LocalValidator);

这样就完成了Hibernate Validator的简单使用。

总结:
到这一步,我们可以发现:使用Hibernate Validator的好处就是避免了单独写验证类,通过注解的形式直接在我们的实体类上就可以完成了

Spring Bean生命周期:从启动初始化到优雅销毁的全流程解析 Spring Bean生命周期是IoC容器管理对象创建、依赖注入、初始化与销毁的核心机制。其本质是围绕Bean实例化(Instantiation)、属性填充(Populate Properties)、Aware回调、BeanPostProcessor处理、初始化方法(@PostConstruct/afterPropertiesSet)、销毁方法(@PreDestroy/destroy)等阶段构成的严格时序链路。该机制保障了依赖注入的可靠性、循环依赖的可解性及资源释放的确定性,直接支撑数据库建表、配置热更新、 阅读详情

相关推荐

Lithe-IDEA:专为Spring Boot打造的轻量级开源Java IDE

Spring Boot 是现代 Java 云原生开发的核心框架,其注解驱动、自动配置和分层架构对开发工具提出精准语义支持要求。传统 IDE 依赖插件动态解析 Spring 元数据,导致启动慢、卡顿高、跳转不准;而 Lithe-IDEA 将 Spring Boot 规范内化为 IDE 内核能力,通过编译期元数据预建模、Skia GPU 加速 UI 和单线程项目模型重构,在保障 Java 17+ 兼容性前提下,实现毫秒级响应与开箱即用的 Controller/Service/Mapper 跨层导航。它不是功能精

weixin_34008784的博客 377

《Spring 5 官方文档》5. 验证、数据绑定和类型转换

《Spring 5 官方文档》5. 验证、数据绑定和类型转换

aoaoxiaoxian的博客 1051

Springmvc数据验证6个详细包,hibernate-validator-5.1.3.Final.jar...

hibernate-validator注册用户登录验证实例已经得到亲测!亲测!亲测!

Spring 5 MVC + Hibernate 5

Spring 5 MVC + Hibernate 5示例 创建Spring 5 MVC Web应用程序,处理表单提交,集成hibernate 5连接到后端数据库,并为输入表单字段验证添加hibernate验证器。 创建一个简单的屏幕,可以在其中添加用户字段(名称和电子邮件)。首先验证这些细节,然后使用hibernate将其存储在Mysql数据库中。该页面还将列出所有存储的用户。 目录 Sp...

花开陌上无言语,溪水流声自悠然。 1520

springMVC整合hibernate的校验Validation

springMVC整合hibernate的校验Validation, 简单明了。

手把手教你用示波器实测CAN总线波形:快速区分高速、低速及常见故障

本文详细介绍了如何使用示波器实测CAN总线波形,快速区分高速CAN总线和低速CAN总线,并诊断常见故障。通过实战案例和波形分析,帮助工程师掌握CAN总线信号特征,提升故障排查效率,适用于汽车电子和工业控制领域。

weixin_33217202的博客 409

spring5+hibernate validation报错NoClassFind javax/el/ElManager

尝试过的办法: pom导入el包 更换tomcat7 最终解决办法,使用tomcat8

u011076854的博客 659

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 559

【Hibernate Validator】简单使用

Spring Boot参数校验最佳实践:告别if-else,拥抱声明式注解 摘要:传统Web开发中参数校验往往导致大量重复代码,而Spring Boot通过Hibernate Validator提供了一套优雅的解决方案。本文介绍了: 通过@NotBlank、@Pattern等注解实现声明式校验 GET请求需在Controller类上加@Validated POST请求在方法参数前加@Valid/@Validated 常见校验注解如@Email、@Size的使用场景 依赖配置和版本要求(需Spring Boo

morris 1213

国际参考电离层2020模型Matlab(IRI-2020)

国际参考电离层 (IRI) 是一个国际项目 由空间研究委员会 (COSPAR) 和国际 无线电科学联盟 (URSI)。这些组织组成了一个工作组 (在 60 年代后期产生了电离层的经验标准模型, 基于所有可用数据源 (几个稳步改进的版本 模型已经发布。电子密度、电子温度、离子温度、 离子组成(O+、H+、He+、N+、NO+、O+2、簇离子)、赤道垂直离子漂移、垂直电离层电子含量(vTEC;

weixin_44392003的博客 4879

Linux中断子系统(二)—— 通用框架处理

1、数据结构分析 (1)中断描述符结构structirq_desc: 1)打开CONFIG_SPARSE_IRQ宏(中断编号不连续),中断描述符以radix- tree来组织,用户在初始化时进行动态分配,然后再插入radix-tree中; 2)关闭CONFIG_SPARSE_IRQ宏(中断编号连续),中断描述符以数组的 形式组织,并且已经分配好; 3)不管哪种形式,最终都可以通过linuxirq号来找到对应的中断描述符; (2)stru...

weixin_38428439的博客 4870

Spring 5 中文解析之核心篇-数据绑定、校验和类型转换

将验证视为业务逻辑有其优缺点,Spring提供的验证(和数据绑定)设计不排除其中任何一种。具体来说,验证不应与Web层绑定,并且应该易于本地化,并且应该可以插入任何可用的验证器。考虑到这些问题,Spring提供了一个Validator契约,该契约既基本又可以在应用程序的每个层中使用。 数据绑定对于使用户输入动态绑定到应用程序的域模型(或用于处理用户输入的任何对象)非常有用。Spring提供了恰当地命名为DataBinder的功能。Validator和DataBinder由validation包组成,被主要的

liyong1028826685的专栏 434

Flutter项目在M1/M2 Mac上跑iOS模拟器报错?手把手教你搞定‘arm64架构不兼容’问题

本文详细解析了Flutter项目在M1/M2 Mac上运行iOS模拟器时遇到的‘arm64架构不兼容’问题,提供了多种解决方案,包括排除模拟器的arm64架构、强制使用x86_64架构以及修改插件Podspec文件。帮助开发者快速解决架构兼容性问题,提升开发效率。

weixin_33713707的博客 335

Javad的Validator框架使用

结合hibernate-validator(除此之外Spring Framework自带的validation,struts validation等),说明Validator框架使用。

任何技能都是从模仿开始,逐步升华。 1720

GD32F303 Keil 工程项目从零搭建实战指南

本文是一份详细的GD32F303 Keil工程项目从零搭建实战指南。文章阐述了亲手搭建工程的重要性,并逐步指导开发者完成从环境准备、目录规划、工程创建、文件添加、关键配置到编译调试的全过程。重点讲解了如何正确选择启动文件、添加外设库、配置头文件路径和全局宏,旨在帮助开发者深入理解工程结构,掌握GD32F303开发的核心技能,实现从“会用”到“懂”的跨越。

weixin_29190651的博客 404

YOLOv8自动驾驶系统 —— 夜间低光照条件 详细说明和完整代码

本文提出一种针对夜间低光照优化的自动驾驶车道保持系统方案,基于YOLOv8模型改进,包含三大核心技术:1.采用Retinex理论的多尺度低光增强算法,结合自适应伽马校正;2.改进YOLOv8的车道检测模型,通过夜间专用数据集训练,增加抗眩光处理;3.多传感器融合框架,整合可见光与红外图像。系统实现动态逆透视变换和参数调整,在Jetson Orin硬件上达到30ms级实时性能。测试显示在无照明、眩光干扰等极端场景下保持稳定,代码已开源。扩展方向包括V2X协同定位和自适应大灯联动控制。

u010117029的博客 596

Spring Framework与Boot核心技术解析及企业级实践

Spring Framework作为Java企业级开发的事实标准,通过依赖注入和面向切面编程等核心机制,构建了现代化的应用架构基础。其衍生的Spring Boot通过自动配置和starter依赖等创新设计,大幅降低了开发复杂度,使开发者能更专注于业务实现。在云原生和微服务架构趋势下,Spring技术栈展现出强大的适应性,支持从传统单体应用到高并发分布式系统的平滑演进。特别是在JDK17支持、响应式编程增强和原生镜像等新特性加持下,Spring Boot 3.0进一步提升了性能表现和开发效率。企业级开发中,合

weixin_33971977的博客 393

TI单芯片毫米波雷达1642demo代码走读(一)

今天我们来实际看下代码。 首先使用CCS软件导入demo工程,工程有两个,一个是ARM的工程,工程名是mmw_mss_16xx;另一个是DSP的工程,工程名为mmw_dss_16xx。我们将这两个工程的主函数打开,分别位于mss_main.c和dss_main.c文件中。 先看mss的主函数,代码如下。我为每行代码都加了中文注释和自己的理解。 int main (void) { Task_Params taskPara...

1万+

使用spring validation完成数据后端校验-自定义校验的注解-判断是否为空

使用spring validation完成数据后端校验

zzy7075的专栏 2264

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

FluentValidator完全指南:Java优雅验证框架的核心功能与快速上手

**FluentValidator** 是一个基于流式接口风格和JSR 303规范的Java验证框架,它让数据验证变得优雅而简单!🚀 在Java开发中,数据验证是业务逻辑层最常见的任务之一,但传统的验证方式往往导致代码重复、难以维护。FluentValidator通过流畅的API设计和强大的扩展能力,彻底改变了Java验证的体验。 ## ✨ 为什么选择FluentValidator? 在复杂

gitblog_01071的博客 645

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Spring Boot 4 与 Kotlin 2.2:原生协程与惯用开发实战

Kotlin 以空安全、协程和函数式特性成为现代 JVM 后端开发的热门选择,但传统 Spring Boot 对 Kotlin 的支持往往停留在语法兼容层面。Spring Boot 4 基于 Spring Framework 7,原生支持 Kotlin 2.2 与 K2 编译器,彻底移除 XML 配置,并深度集成协程、suspend 函数与 HTTP Interface,让 Kotlin 开发者摆脱 Java 思维束缚。本文从 Kotlin 语言核心优势切入,剖析 Spring Boot 4 底层架构变化,

weixin_34007020的博客 506

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java入门到精通-38 Spring Boot入门——自动配置、核心注解与Starter机制

摘要 本文介绍了Spring Boot的核心概念与快速入门指南。Spring Boot通过自动配置、Starter依赖和内嵌服务器等特性,大幅简化了Spring应用的开发流程。主要内容包括: Spring Boot概述:解释其"约定优于配置"理念,对比传统Spring开发的繁琐配置 核心特性:自动配置、Starter依赖管理、内嵌服务器等 项目创建:通过Spring Initializr快速生成项目结构 关键配置:分析pom.xml的依赖管理和启动类注解 快速开发:演示如何创建简单的REST接口 Sprin

weixin_56693899的博客 467

Java29:Spring MVC

Spring Web MVC 是基于Servlet API构建的原始Web框架,从一开始就包含在Spring Framework中。正式名称“Spring Web MVC” 来自其源模块名称(spring-webmvc)但它通常被称为“Spring Mvc”在控制层框架历经 Strust ,WebWork,Strust2等诸多产品的历代更迭之后,目前业界普遍选择了Spring MVC 作为JavaEE 项目表述层开发的首先方案。优势:》Spring 家族的原生产品,与IOC容器等基础设施无缝对接。

zzx_nihao的博客 1224

Lithe-IDEA:轻量开源版Spring Boot专用IDE

Java IDE 是支撑企业级应用开发的核心工具,其本质是基于 PSI(程序结构接口)与索引机制实现代码理解、导航与重构。传统 IntelliJ IDEA 社区版对 Spring Boot 3.x、Jakarta EE、MyBatis XML 等主流工程支持不足,而 Ultimate 版存在内存占用高、启动慢、授权成本高等问题;VS Code + Java 扩展则受限于 LSP 协议,在泛型解析、字符串引用 rename、框架级调试等场景精度不足。Lithe-IDEA 以 IntelliJ Platform

weixin_33889665的博客 199

Spring Boot 3.4.13 + JDK 17 迁移实战:从架构重置到生产就绪

Spring Boot 和 JDK 是 Java 企业级应用的核心运行时基础。Spring Boot 3.x 强制要求 JDK 17+,标志着从传统 Servlet 容器、Parallel GC 到 Jakarta EE 9 命名空间、ZGC 与模块化 JVM 的代际升级。其本质不仅是版本更新,更是字节码规范(Class File Format 61)、API 契约(javax → jakarta)和内存模型的全面对齐。技术价值体现在低延迟(ZGC P99 <10ms)、强安全(TLS 1.3 原生支持)与

weixin_30653023的博客 427

Lithe-IDEA:专为Spring Boot开发优化的轻量级开源Java IDE

IDE(集成开发环境)是支撑现代Java应用开发的核心工具,其本质在于缩短‘编码意图’到‘可验证结果’的反馈闭环。传统IDE如IntelliJ或VS Code虽功能全面,但通用架构带来启动慢、内存高、索引冗余等工程损耗。随着Spring Boot成为企业级Java开发事实标准,开发者亟需一种深度语义感知、零配置即用、响应亚秒级的专业化工具。Lithe-IDEA正是这一需求的产物——它放弃插件生态与多语言支持,转而将Spring Boot自动配置、Bean生命周期、Actuator端点等框架能力编译进Rust

weixin_34416649的博客 859
上一篇: Spring Framework 5.0:Resources资源文件获取接口
下一篇: Hibernate Validator:自定义验证
学习笔记666
博客等级 码龄12年 1047粉丝 1369原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值