springboot 2.3之后消失的hibernate-validator解决方法

下面是详细的攻略:

问题背景

在Spring Boot 2.3版本之后,引入了一个新的starter库,名为validation-starter,用于提供Java Bean的数据校验功能。同时,hibernate-validator也被移出了Spring Boot的核心依赖,这导致运行时找不到这个库,会报出ClassNotFoundException的错误。

解决方法

为了解决这个问题,我们需要手动引入hibernate-validator库,并且排除掉validation-starter库的依赖。下面是具体的步骤:

1. 在pom.xml文件中添加依赖

<dependencies> 标签中添加下面的依赖:

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.13.Final</version>
</dependency>

2. 排除validation-starter库的依赖

<dependencies> 标签中添加下面的配置:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 引入自定义的ValidatorConfiguration

在启动类(如Application.java)上添加注解,指定需要使用自定义的ValidatorConfiguration类:

@SpringBootApplication
@Import(ValidatorConfiguration.class)
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

这个自定义类做的是,设置Validation的Bean桥URI,以解决在2.3之后无法自动配置的问题。

@Configuration
public class ValidatorConfiguration {

    @Bean
    public LocalValidatorFactoryBean localValidatorFactoryBean() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(validationMessageSource());
        bean.setProviderClass(HibernateValidator.class);
        return bean;
    }

    @Bean
    public MessageSource validationMessageSource() {
        ReloadableResourceBundleMessageSource bean = new ReloadableResourceBundleMessageSource();
        bean.setBasename("classpath:ValidationMessages");
        bean.setDefaultEncoding("UTF-8");
        return bean;
    }

    @Bean
    public Validator validator() {
        return localValidatorFactoryBean();
    }
}

其中主要是设置了默认的ValidationMessages.properties文件的位置和编码格式。

示例

为了更好的理解上面的步骤,下面给出两个示例:

示例1:在Controller中使用数据校验

在Controller中,我们需要使用@Valid注解来使Spring自动执行数据校验,例如:

@RestController
public class UserController {

    @PostMapping("/users")
    public User createUser(@Valid @RequestBody User user) {
        // some logic
    }

}

这里的@Valid注解需要使用我们手动引入的hibernate-validator库中的注解,才能起到校验数据的作用。

示例2:定义数据校验规则

我们定义一个User类,希望校验其中的年龄age属性必须大于等于18岁。具体实现如下:

public class User {

    private String name;

    @Min(value = 18, message = "必须大于等于18岁")
    private int age;

    // getters and setters
}

这里使用了hibernate-validator库中的@Min注解来定义年龄的最小值,并设置了错误提示信息。当使用@Valid注解校验User对象时,如果age小于18,会抛出ConstraintViolationException异常,并且包含错误提示信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot 2.3之后消失的hibernate-validator解决方法 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java前后端分离的在线点餐系统实现详解

    让我来为您详细讲解“Java前后端分离的在线点餐系统实现详解”的完整攻略。 一、实现方案 该在线点餐系统基于前后端分离架构实现,前端使用Vue.js框架,后端使用Spring Boot框架进行开发。 前端主要包含登录注册、菜单展示、下单、支付等功能,使用Vue.js作为开发框架,采用Vue Router进行页面路由控制,使用Vuex进行状态管理。 后端主要包…

    Java 2023年5月24日
    00
  • Java的字符读写类CharArrayReader和CharArrayWriter使用示例

    标题:Java的字符读写类CharArrayReader和CharArrayWriter使用示例 简介 CharArrayReader和CharArrayWriter是Java I/O库中的两个字符流类,用于读写字符数组。其中,CharArrayReader用于读取字符数组,CharArrayWriter用于向字符数组写入数据。它们可以方便地操作字符数组,是…

    Java 2023年5月27日
    00
  • 浅谈几种Java自定义异常处理方式

    浅谈几种Java自定义异常处理方式 在Java中,异常是一种非常常见的错误类型,如果没有捕获和处理异常,程序很容易因为意外的错误而导致崩溃。Java允许我们自定义异常类型,来处理程序中特定的异常情况。本文将对几种Java自定义异常处理方式进行探讨,并提供示例代码来帮助读者加深对这些技术的理解。 自定义异常类 我们可以通过继承 Java 内置的异常类(Thro…

    Java 2023年5月20日
    00
  • SpringBoot集成Shiro进行权限控制和管理的示例

    下面我来详细讲解“SpringBoot集成Shiro进行权限控制和管理的示例”的完整攻略。 什么是 Shiro Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,提供身份验证、授权、加密等功能,可以轻松地保护应用程序的安全与隐私。 SpringBoot 集成 Shiro 下面是 SpringBoot 集成 Shiro 进行权限控制和管…

    Java 2023年6月15日
    00
  • JSP中表达式的使用详解

    《JSP中表达式的使用详解》攻略 一、JSP表达式的介绍 JSP表达式一般用于将变量、常量、函数等的值输出到页面上。 语法格式: <%= 表达式 %> 其中,等号和百分号之间不要有空格。 二、表达式中可使用的内容 变量和常量 在表达式中可以使用变量或常量的值,如: <%= name %> <%= 1234 %> 表达式运算…

    Java 2023年6月15日
    00
  • Java中文件的读写方法之IO流详解

    Java中文件的读写方法之IO流详解 什么是Java IO流 Java IO(Input/Output)流是一种用于处理输入输出的机制,它为我们提供了读取和写入数据的方法,可从不同来源读取数据,例如网络、文件等,也可以将数据写入到不同的位置,例如文件、网络等。Java IO流分为输入流和输出流,其中,输入流用于读取数据,输出流用于写入数据。 Java IO流…

    Java 2023年5月19日
    00
  • Spring gateway + Oauth2实现单点登录及详细配置

    以下是 “Spring Gateway + Oauth2 实现单点登录及详细配置”的完整攻略。 1. 概述 单点登录(Single Sign-On,简称 SSO)是企业级应用系统中经常用到的功能之一。在现代应用架构中,前后端的分离和微服务架构的流行,使得如何实现 SSO 变得更为复杂。本文将详细介绍如何使用 Spring Gateway 和 Spring S…

    Java 2023年5月20日
    00
  • 使用Tomcat Native提升Tomcat IO效率的方法详解

    使用Tomcat Native提升Tomcat IO效率的方法详解 什么是Tomcat Native Tomcat Native是一个可选组件,它提供了使用操作系统本地库来优化Tomcat的I/O性能的功能。通过使用Tomcat Native,Tomcat服务器能够基于操作系统优化的IO处理提高性能。 安装Tomcat Native 要使用Tomcat Na…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部