
Java
使用Hibernate Validator和自定义ResourceBundleLocator来实现国际化校验消息
背景在开发过程中,数据校验是一个非常重要的环节。而校验的错误消息通常需要被国际化,以满足不同语言环境下的需求。Hibernate Validator是一个非常流行的校验框架,它提供了丰富的注解以及校验器来满足我们的需求。同时,Hibernate Validator还提供了默认的错误消息资源文件,但是如果我们的项目需要自定义错误消息,并且希望通过自然语言生成,那么就需要使用自定义ResourceBundleLocator来实现。自定义ResourceBundleLocator在使用Hibernate Validator时,默认的错误消息资源文件是ValidationMessages.properties。我们可以通过自定义ResourceBundleLocator来指定其他的资源文件,以满足不同语言环境下的需求。首先,我们需要创建一个实现了ResourceBundleLocator接口的类。该接口有一个方法getBundle(),用于返回错误消息的资源文件。Javapublic class MyResourceBundleLocator implements ResourceBundleLocator { @Override public ResourceBundle getResourceBundle(Locale locale) { // 这里可以根据不同的locale返回不同的资源文件 return ResourceBundle.getBundle("MyValidationMessages", locale); }}在上面的代码中,我们通过getResourceBundle()方法返回了一个名为MyValidationMessages的资源文件。在实际应用中,我们可以根据不同的locale返回不同的资源文件,以满足多语言的需求。使用自定义ResourceBundleLocator在Spring项目中,我们可以通过配置来使用自定义的ResourceBundleLocator。在application.properties文件中添加以下配置:propertiesSpring.messages.basename=ValidationMessages,MyValidationMessages在上面的配置中,我们指定了两个资源文件,分别为ValidationMessages和MyValidationMessages。这样,当校验出错时,Validator就会先在ValidationMessages中查找错误消息,如果找不到,则在MyValidationMessages中查找。我们还需要在Validator的配置类中添加以下配置:
Java@Configurationpublic 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中添加以下内容:propertiesJavax.validation.constrAInts.NotNull.message=姓名不能为空然后,我们创建一个UserController类,其中包含一个保存用户信息的方法:
Java@RestControllerpublic 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,并将错误消息集成到我们的项目中。Copyright © 2025 IZhiDa.com All Rights Reserved.
知答 版权所有 粤ICP备2023042255号