当前位置:

首页 > 编程开发 > Spring Boot整合Hibernate验证器指南

Spring Boot整合Hibernate验证器指南

SpringBoot整合Hibernate验证器通过添加依赖、定义校验规则、在Controller中使用@Valid注解、可选全局异常处理、自定义注解、分组校验、嵌套对象校验、错误信息国际化、快速失败模式配置等步骤实现数据校验。1.添加spring-boot-starter-validation依赖;2.在实体类或DTO中使用@NotBlank、@Size等注解定义规则;3.Controller中用@Valid触发校验并用BindingResult获取结果;4.可创建全局异常处理器捕获MethodArgu

本文目录

    Spring Boot整合Hibernate验证器通过添加依赖、定义校验规则、在Controller中使用@Valid注解、可选全局异常处理、自定义注解、分组校验、嵌套对象校验、错误信息国际化、快速失败模式配置等步骤实现数据校验。1. 添加spring-boot-starter-validation依赖;2. 在实体类或DTO中使用@NotBlank、@Size等注解定义规则;3. Controller中用@Valid触发校验并用BindingResult获取结果;4. 可创建全局异常处理器捕获MethodArgumentNotValidException;5. 自定义注解需创建注解和校验器类并实现ConstraintValidator接口;6. 分组校验通过定义分组接口并在注解中指定groups属性;7. 嵌套对象需在属性上加@Valid启用校验;8. 国际化通过ValidationMessages.properties文件配置;9. 快速失败模式通过配置ValidatorFactory的failFast(true)实现;常见问题包括EL依赖缺失、注解未生效、自定义注解无法注入Bean等,需分别添加依赖、检查注解使用、注册校验器为Bean等方式解决。

    Spring Boot整合Hibernate验证器教程

    Spring Boot整合Hibernate验证器,主要是为了在你的应用中实现更方便、更强大的数据校验。它利用了Hibernate Validator,这是一个Bean Validation(JSR 380)的参考实现,可以让你通过注解的方式,轻松地对Java Bean的属性进行各种约束校验。

    Spring Boot整合Hibernate验证器教程

    解决方案:

    1. 添加依赖: 首先,需要在你的pom.xml文件中加入相应的依赖。Spring Boot通常会自动包含spring-boot-starter-validation,但如果没包含,手动添加一下:

      Spring Boot整合Hibernate验证器教程
      
          org.springframework.boot
          spring-boot-starter-validation
      

      如果你的项目没有使用Spring Boot,你需要手动添加Hibernate Validator和Bean Validation API的依赖。

    2. 定义校验规则: 在你的实体类(Entity)或者DTO(Data Transfer Object)的属性上,使用注解来定义校验规则。例如:

      Spring Boot整合Hibernate验证器教程
      import javax.validation.constraints.NotBlank;
      import javax.validation.constraints.Size;
      
      public class User {
      
          @NotBlank(message = "用户名不能为空")
          @Size(min = 3, max = 20, message = "用户名长度必须在3到20之间")
          private String username;
      
          @NotBlank(message = "密码不能为空")
          private String password;
      
          // Getters and setters
      }

      这里使用了@NotBlank和@Size注解,分别表示该属性不能为空,且长度必须在3到20之间。message属性可以自定义错误提示信息。

    3. 在Controller中使用: 在你的Controller中,使用@Valid注解来触发校验。同时,需要使用BindingResult来获取校验结果。

      import org.springframework.validation.BindingResult;
      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;
      
      @RestController
      public class UserController {
      
          @PostMapping("/users")
          public String createUser(@Valid @RequestBody User user, BindingResult result) {
              if (result.hasErrors()) {
                  // 处理校验失败的情况
                  return "校验失败:" + result.getAllErrors().get(0).getDefaultMessage(); // 简化处理,只返回第一个错误信息
              }
      
              // 处理创建用户的逻辑
              return "用户创建成功";
          }
      }

      @Valid注解告诉Spring MVC要对User对象进行校验。BindingResult对象包含了校验的结果,可以通过hasErrors()方法判断是否有错误,并通过getAllErrors()方法获取所有的错误信息。

    4. 全局异常处理(可选): 为了更优雅地处理校验失败的情况,可以配置全局异常处理。创建一个全局异常处理器,捕获MethodArgumentNotValidException异常,该异常会在@Valid校验失败时抛出。

      import org.springframework.http.HttpStatus;
      import org.springframework.http.ResponseEntity;
      import org.springframework.web.bind.MethodArgumentNotValidException;
      import org.springframework.web.bind.annotation.ControllerAdvice;
      import org.springframework.web.bind.annotation.ExceptionHandler;
      
      import java.util.HashMap;
      import java.util.Map;
      
      @ControllerAdvice
      public class GlobalExceptionHandler {
      
          @ExceptionHandler(MethodArgumentNotValidException.class)
          public ResponseEntity handleValidationExceptions(MethodArgumentNotValidException ex) {
              Map errors = new HashMap<>();
              ex.getBindingResult().getFieldErrors().forEach(error -> {
                  errors.put(error.getField(), error.getDefaultMessage());
              });
              return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);
          }
      }

      这样,当校验失败时,会返回一个包含所有错误信息的JSON响应,方便前端处理。

      如何自定义Hibernate Validator的校验注解?

      自定义校验注解是Hibernate Validator的强大之处。有时候内置的注解无法满足需求,比如需要校验身份证号码的格式,或者校验某个字段是否在指定的枚举值范围内。

      1. 创建注解: 首先,需要创建一个自定义的注解。这个注解需要使用@Constraint注解来指定一个校验器,使用@Target注解来指定注解可以使用的位置(例如字段、方法等),使用@Retention注解来指定注解的生命周期。

        import javax.validation.Constraint;
        import javax.validation.Payload;
        import java.lang.annotation.*;
        
        @Documented
        @Constraint(validatedBy = {MyCustomValidator.class}) // 指定校验器
        @Target({ElementType.METHOD, ElementType.FIELD}) // 指定注解可以使用的位置
        @Retention(RetentionPolicy.RUNTIME) // 指定注解的生命周期
        public @interface MyCustomAnnotation {
        
            String message() default "自定义校验失败"; // 默认的错误提示信息
        
            Class[] groups() default {};
        
            Class[] payload() default {};
        }
      2. 创建校验器: 接下来,需要创建一个校验器类,实现ConstraintValidator接口。这个接口有两个泛型参数,第一个是自定义注解的类型,第二个是被校验的属性的类型。

        import javax.validation.ConstraintValidator;
        import javax.validation.ConstraintValidatorContext;
        
        public class MyCustomValidator implements ConstraintValidator {
        
            @Override
            public void initialize(MyCustomAnnotation constraintAnnotation) {
                // 初始化方法,可以获取注解的属性
            }
        
            @Override
            public boolean isValid(String value, ConstraintValidatorContext context) {
                // 实现校验逻辑
                if (value == null) {
                    return true; // 允许为空
                }
                return value.startsWith("custom"); // 假设校验规则是必须以"custom"开头
            }
        }

        initialize方法用于初始化校验器,可以获取注解的属性。isValid方法用于实现校验逻辑,返回true表示校验通过,返回false表示校验失败。

      3. 使用自定义注解: 现在,就可以在实体类的属性上使用自定义注解了。

        public class User {
        
            @MyCustomAnnotation(message = "用户名必须以custom开头")
            private String username;
        
            // Getters and setters
        }

      如何在Spring Boot中启用分组校验?

      分组校验允许你根据不同的场景,使用不同的校验规则。例如,在创建用户时需要校验密码,而在更新用户时不需要校验密码。

      1. 定义分组接口: 首先,需要定义一些分组接口。这些接口不需要包含任何方法,只需要作为标识即可。

        public interface CreateUser {
        }
        
        public interface UpdateUser {
        }
      2. 在注解中指定分组: 在校验注解中,使用groups属性来指定分组。

        import javax.validation.constraints.NotBlank;
        
        public class User {
        
            @NotBlank(message = "用户名不能为空", groups = {CreateUser.class})
            private String username;
        
            @NotBlank(message = "密码不能为空", groups = {CreateUser.class})
            private String password;
        
            // Getters and setters
        }

        这里指定username和password属性在CreateUser分组中不能为空。

      3. 在Controller中使用: 在Controller中,使用@Validated注解来指定要使用的分组。

        import org.springframework.validation.annotation.Validated;
        import org.springframework.web.bind.annotation.PostMapping;
        import org.springframework.web.bind.annotation.RequestBody;
        import org.springframework.web.bind.annotation.RestController;
        
        @RestController
        public class UserController {
        
            @PostMapping("/users")
            public String createUser(@Validated(CreateUser.class) @RequestBody User user) {
                // 处理创建用户的逻辑
                return "用户创建成功";
            }
        
            @PostMapping("/users/{id}")
            public String updateUser(@Validated(UpdateUser.class) @RequestBody User user) {
                // 处理更新用户的逻辑
                return "用户更新成功";
            }
        }

        注意,这里使用了@Validated注解,而不是@Valid注解。@Validated注解是Spring提供的,用于支持分组校验。

      如何处理嵌套对象的校验?

      有时候,一个实体类包含另一个实体类作为属性,需要对嵌套对象进行校验。

      1. 使用@Valid注解: 在包含嵌套对象的属性上,使用@Valid注解。

        import javax.validation.Valid;
        import javax.validation.constraints.NotBlank;
        
        public class Address {
        
            @NotBlank(message = "城市不能为空")
            private String city;
        
            // Getters and setters
        }
        
        public class User {
        
            @NotBlank(message = "用户名不能为空")
            private String username;
        
            @Valid // 启用嵌套校验
            private Address address;
        
            // Getters and setters
        }

        这里在User类的address属性上使用了@Valid注解,表示需要对Address对象进行校验。

      2. 在Controller中使用: 在Controller中,和普通对象一样,使用@Valid注解来触发校验。

        import org.springframework.validation.BindingResult;
        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;
        
        @RestController
        public class UserController {
        
            @PostMapping("/users")
            public String createUser(@Valid @RequestBody User user, BindingResult result) {
                if (result.hasErrors()) {
                    // 处理校验失败的情况
                    return "校验失败:" + result.getAllErrors().get(0).getDefaultMessage();
                }
        
                // 处理创建用户的逻辑
                return "用户创建成功";
            }
        }

        这样,当校验User对象时,会自动校验其address属性对应的Address对象。

      校验错误信息国际化

      为了支持多语言,需要将校验错误信息进行国际化。

      1. 创建ValidationMessages.properties文件: 在src/main/resources目录下,创建一个ValidationMessages.properties文件,用于存放默认的错误提示信息。

        NotBlank.user.username=用户名不能为空
        Size.user.username=用户名长度必须在{min}到{max}之间

        这里的NotBlank.user.username和Size.user.username分别对应NotBlank和Size注解的错误提示信息。user.username是实体类名和属性名的组合,可以自定义。

      2. 在注解中使用{}占位符: 在校验注解中,使用{}占位符来引用ValidationMessages.properties文件中的错误提示信息。

        import javax.validation.constraints.NotBlank;
        import javax.validation.constraints.Size;
        
        public class User {
        
            @NotBlank(message = "{NotBlank.user.username}")
            @Size(min = 3, max = 20, message = "{Size.user.username}")
            private String username;
        
            // Getters and setters
        }
      3. 支持多语言: 创建不同语言的ValidationMessages.properties文件,例如ValidationMessages_zh_CN.properties和ValidationMessages_en_US.properties,用于存放不同语言的错误提示信息。

        # ValidationMessages_zh_CN.properties
        NotBlank.user.username=用户名不能为空
        Size.user.username=用户名长度必须在{min}到{max}之间
        
        # ValidationMessages_en_US.properties
        NotBlank.user.username=Username cannot be blank
        Size.user.username=Username length must be between {min} and {max}

        Spring Boot会自动根据请求的Accept-Language头来选择合适的语言文件。

      校验器快速失败模式

      默认情况下,Hibernate Validator会校验所有的属性,然后返回所有的错误信息。如果希望在遇到第一个错误时就停止校验,可以使用快速失败模式。

      1. 配置ValidatorFactory: 创建一个ValidatorFactory,并配置其为快速失败模式。

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

        这里通过failFast(true)开启了快速失败模式。

      2. 使用Validator: 在需要校验的地方,注入Validator对象,并使用其validate方法进行校验。

        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Service;
        
        import javax.validation.ConstraintViolation;
        import javax.validation.Validator;
        import java.util.Set;
        
        @Service
        public class UserService {
        
            @Autowired
            private Validator validator;
        
            public void createUser(User user) {
                Set> violations = validator.validate(user);
                if (!violations.isEmpty()) {
                    // 处理校验失败的情况
                    throw new IllegalArgumentException(violations.iterator().next().getMessage()); // 只返回第一个错误信息
                }
        
                // 处理创建用户的逻辑
            }
        }

        这样,当校验User对象时,遇到第一个错误就会停止校验,并抛出异常。

      常见错误与解决方案

      1. javax.validation.ValidationException: HV000183: Unable to load 'javax.el.ExpressionFactory'. Check that you have the EL dependencies on the classpath

        这个错误通常是由于缺少EL(Expression Language)依赖导致的。需要在pom.xml文件中添加EL依赖:

        
            org.glassfish
            javax.el
            3.0.1-b09
        
      2. 校验注解不生效

        • 确认已经添加了spring-boot-starter-validation依赖。
        • 确认已经在Controller中使用了@Valid或@Validated注解。
        • 确认实体类的属性上使用了正确的校验注解。
        • 如果使用了自定义校验注解,确认校验器类实现了ConstraintValidator接口,并且isValid方法返回了正确的校验结果。
      3. 自定义校验注解无法获取Spring Bean

        如果需要在自定义校验器中使用Spring Bean,可以使用@Autowired注解来注入。但是,需要将校验器类注册为Spring Bean。

        import org.springframework.beans.factory.annotation.Autowired;
        import org.springframework.stereotype.Component;
        
        import javax.validation.ConstraintValidator;
        import javax.validation.ConstraintValidatorContext;
        
        @Component // 注册为Spring Bean
        public class MyCustomValidator implements ConstraintValidator {
        
            @Autowired
            private MyService myService;
        
            @Override
            public void initialize(MyCustomAnnotation constraintAnnotation) {
                // 初始化方法,可以获取注解的属性
            }
        
            @Override
            public boolean isValid(String value, ConstraintValidatorContext context) {
                // 实现校验逻辑
                if (value == null) {
                    return true; // 允许为空
                }
                return myService.isValid(value); // 使用Spring Bean进行校验
            }
        }

        这样,就可以在校验器中使用MyService Spring Bean了。

      希望这些内容能够帮助你更好地理解和使用Spring Boot整合Hibernate验证器。

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
      作者最新文章
      编程开发
      相关文章 更多
      GitHub六个AI开源项目能做什么?软件理解、语音与求职场景
      GitHub六个AI开源项目能做什么?软件理解、语音与求职场景

      解析六个GitHub AI开源项目的具体用途,包括软件静态分析、智能体回答检查、多语言配音、求职材料生成、本地代码检索及动态歌词展示,帮助开发者根据实际需求筛选工具并正确验证结果。

      opencode安装skills教程及本地配置方法
      opencode安装skills教程及本地配置方法

      遇到OpenCode Skills无法加载或配置无效?本文手把手教你完成Skills的安装、环境变量设置及本地调试,避开常见坑点,让AI助手更懂你的代码习惯。

      如何开启Visual Studio2022实时代码分析警告提示
      如何开启Visual Studio2022实时代码分析警告提示

      解决 Visual Studio 2022 编辑时不显示代码分析警告的问题。指南涵盖 .NET 项目实时分析设置、Roslyn 分析器范围调整及错误列表来源筛选,确保开发者能高效利用实时代码诊断功能。

      如何在Visual Studio2022查看变量监视窗口调试程序
      如何在Visual Studio2022查看变量监视窗口调试程序

      详解 Visual Studio 2022 调试技巧:包括断点设置、监视窗口开启方法、变量添加步骤以及通过 F10 单步执行观察变量值变化的全过程。

      Visual Studio2017设置默认编码为UTF-8不带BOM
      Visual Studio2017设置默认编码为UTF-8不带BOM

      针对 Visual Studio 2017 缺乏全局默认编码选项的情况,详解如何利用 .editorconfig 设定项目级 UTF-8 无 BOM 规则,以及手动转换现有文件并校验字节的方法。

      Visual Studio2022F5调试提示启动项目未配置怎么修复
      Visual Studio2022F5调试提示启动项目未配置怎么修复

      解决 Visual Studio 2022 F5 调试报错问题,通过设置启动项目、检查解决方案属性及正确区分类库与应用项目,快速恢复调试功能。

      Visual Studio2022NuGet包还原失败离线处理方案
      Visual Studio2022NuGet包还原失败离线处理方案

      解决Visual Studio 2022离线环境中NuGet包还原失败的难题,涵盖依赖链分析、本地源配置、包集收集及隔离验证步骤,帮助开发者构建稳定的离线开发环境。

      Visual Studio2017大项目加载缓慢,优化加载性能技巧
      Visual Studio2017大项目加载缓慢,优化加载性能技巧

      解决Visual Studio 2017大型项目加载慢的实用指南。涵盖性能监测、扩展管理、文档恢复优化及版本兼容性检查,帮助开发者精准定位瓶颈并提升工作效率。

      Visual Studio2022设置多启动项目同时调试运行
      Visual Studio2022设置多启动项目同时调试运行

      详解 Visual Studio 2022 多启动项目配置方法,包括启动动作选择、顺序调整及调试技巧,帮助开发者高效调试分布式或前后端分离应用。

      fastapi下载文件接口实现教程
      fastapi下载文件接口实现教程

      深入解析在FastAPI框架中实现文件下载接口的完整方案,涵盖基于FileResponse的本地静态文件传输、基于StreamingResponse的分块流式传输、RFC 5987中文文件名编码规范、路径穿越安全防御及BackgroundTasks临时文件清理,并配备详细代码示例与架构解析图。

      查看更多
      精品专题 更多
      装机必备
      装机必备

      正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

      Windows
      Windows

      正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

      PDF教程
      PDF教程

      正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

      Mac软件 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      Aperty macOS版
      Aperty macOS版
      macOS

      Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

      WINDOWS 更多
      讯飞智作 网页版
      讯飞智作 网页版
      Windows/ macOS/ Linux

      讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

      火山引擎 网页版
      火山引擎 网页版
      Windows/ macOS/ Linux

      火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

      PixTV 网页版
      PixTV 网页版
      Windows

      PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

      为什么要购买正版软件?
      01 官方授权

      授权来源透明,订单与许可信息可随时查询。

      02 即时交付

      付款成功后自动发放激活信息,支持订单追踪。

      03 中文协助

      安装、激活、迁移与续费问题都有专人响应。

      04 长期可用

      提供升级提醒与授权管理,换机时也能轻松迁移。

      网站备案号:苏ICP备2026018738号-1 联系邮箱:bd@zhengruan.com 网站地图

      Copyright ©2018-2026