Hibernate Validator、自定义 ResourceBundleLocator 和 Spring

spring

1个回答

写回答

肝肝

2025-06-26 05:10

+ 关注

Java
Java

使用Hibernate Validator和自定义ResourceBundleLocator来实现国际化校验消息

背景

在开发过程中,数据校验是一个非常重要的环节。而校验的错误消息通常需要被国际化,以满足不同语言环境下的需求。Hibernate Validator是一个非常流行的校验框架,它提供了丰富的注解以及校验器来满足我们的需求。同时,Hibernate Validator还提供了默认的错误消息资源文件,但是如果我们的项目需要自定义错误消息,并且希望通过自然语言生成,那么就需要使用自定义ResourceBundleLocator来实现。

自定义ResourceBundleLocator

在使用Hibernate Validator时,默认的错误消息资源文件是ValidationMessages.properties。我们可以通过自定义ResourceBundleLocator来指定其他的资源文件,以满足不同语言环境下的需求。

首先,我们需要创建一个实现了ResourceBundleLocator接口的类。该接口有一个方法getBundle(),用于返回错误消息的资源文件。

Java

public class MyResourceBundleLocator implements ResourceBundleLocator {

@Override

public ResourceBundle getResourceBundle(Locale locale) {

// 这里可以根据不同的locale返回不同的资源文件

return ResourceBundle.getBundle("MyValidationMessages", locale);

}

}

在上面的代码中,我们通过getResourceBundle()方法返回了一个名为MyValidationMessages的资源文件。在实际应用中,我们可以根据不同的locale返回不同的资源文件,以满足多语言的需求。

使用自定义ResourceBundleLocator

在Spring项目中,我们可以通过配置来使用自定义的ResourceBundleLocator。在application.properties文件中添加以下配置:

properties

Spring.messages.basename=ValidationMessages,MyValidationMessages

在上面的配置中,我们指定了两个资源文件,分别为ValidationMessages和MyValidationMessages。这样,当校验出错时,Validator就会先在ValidationMessages中查找错误消息,如果找不到,则在MyValidationMessages中查找。

我们还需要在Validator的配置类中添加以下配置:

Java

@Configuration

public class ValidatorConfig {

@Autowired

private MessageSource messageSource;

@PostConstruct

public void init() {

ValidatorFactory validatorFactory = Validation.byDefaultProvider()

.configure()

.messageInterpolator(new ResourceBundleMessageInterpolator(new MyResourceBundleLocator()))

.buildValidatorFactory();

Validator validator = validatorFactory.getValidator();

SpringValidatorAdapter SpringValidatorAdapter = new SpringValidatorAdapter(validator);

SpringValidatorAdapter.setMessageInterpolator(new ResourceBundleMessageInterpolator(messageSource));

ValidationUtils.setValidator(SpringValidatorAdapter);

}

}

在上面的代码中,我们首先创建了一个ValidatorFactory,并通过messageInterpolator()方法指定了使用自定义的ResourceBundleLocator。然后,我们通过ValidatorFactory获取了Validator,并将其转换为SpringValidatorAdapter。最后,我们通过ValidationUtils.setValidator()方法将SpringValidatorAdapter设置为默认的校验器。

案例代码

假设我们有一个User类,其中包含name和age两个属性。我们希望对name进行非空校验,并且自定义错误消息。

首先,我们在资源文件ValidationMessages.properties中添加以下内容:

properties

Javax.validation.constrAInts.NotNull.message=姓名不能为空

然后,我们创建一个UserController类,其中包含一个保存用户信息的方法:

Java

@RestController

public class UserController {

@PostMapping("/users")

public String saveUser(@Valid @RequestBody User user) {

// 保存用户信息

return "保存成功";

}

}

在上面的代码中,我们通过@Valid注解对User对象进行校验。如果校验不通过,会抛出MethodArgumentNotValidException异常。

接下来,我们在Postman中发送一个请求,请求体为一个空的User对象。由于name属性被@NotNull注解修饰,所以校验不通过,会返回一个错误消息"姓名不能为空"。

通过使用Hibernate Validator和自定义ResourceBundleLocator,我们可以实现国际化校验消息的功能。通过自然语言生成的错误消息,可以更好地满足不同语言环境下的需求。同时,Spring的集成也使得我们能够更方便地使用Hibernate Validator,并将错误消息集成到我们的项目中。

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号