下面是详细的攻略:
问题背景
在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技术站