在使用 JSR-303 验证表单时使用 I18n 消息

Posted

技术标签:

【中文标题】在使用 JSR-303 验证表单时使用 I18n 消息【英文标题】:Using I18n messages while validating forms with JSR-303 【发布时间】:2016-04-25 01:11:21 【问题描述】:

我的应用是带有 thymeleaf 模板引擎的完全配置的 spring-boot 应用。 I18n 也进行了配置,因此我可以在我的模板中使用它。这是我使用的配置:

spring.messages.basename=i18n/messages

虽然手动验证字段 I18n 也可以正常工作:

BindingResult result;
result.rejectValue("field", "some.i18n.code");

但是,一旦我想实现一些自定义 ConstraintValidator 对象并使用 message 字段 - 不涉及 I18n,我会收到纯代码作为响应而不是消息。 IE。

some.i18n.code

我试过this solution - 没有结果。 This on 也是 - 结果相同。

我错过了什么?

【问题讨论】:

【参考方案1】:

我想我找到了解决方案,也许它会对其他人有所帮助。您所要做的就是将以下定义添加到您的 WebMvcConfigurerAdapter 配置实现中:

@Autowired
private MessageSource messageSource;

@Bean
public LocalValidatorFactoryBean validator() 
     LocalValidatorFactoryBean validatorFactoryBean = new LocalValidatorFactoryBean();
     validatorFactoryBean.setValidationMessageSource(messageSource);

     return validatorFactoryBean;


@Override
public Validator getValidator() 
     return validator();

【讨论】:

【参考方案2】:

另一种解决方案是在您的任何 @Configuration 类中声明此 bean:

@Bean
public LocalValidatorFactoryBean localValidatorFactoryBean(MessageSource messageSource) 
    LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
    bean.setValidationMessageSource(messageSource);
    return bean;

由于声明了这一点,现在正在我的messages.properties 中搜索来自我的自定义验证器的自定义错误代码(我也通过声明spring.messages.basename=i18n/messagesi18n 子目录中找到该代码)。

示例验证器代码:

public class ContestValidator implements ConstraintValidator<ValidContest, CreateContestParameters> 

  @Override
  public void initialize(ValidContest constraintAnnotation) 

  

  @Override
  public boolean isValid(CreateContestParameters contestParameters, ConstraintValidatorContext context) 
    boolean result = true;

    if (!endDateIsEqualOrAfterStartDate(contestParameters)) 
        context.buildConstraintViolationWithTemplate("Contest.endDate.invalid")
               .addPropertyNode("endDate").addConstraintViolation();
        result = false;
    
    if (!registrationDeadlineIsBeforeStartDate(contestParameters)) 
        context.buildConstraintViolationWithTemplate("Contest.registrationDeadline.invalid")
               .addPropertyNode("registrationDeadline").addConstraintViolation();
    
    return result;
  

【讨论】:

以上是关于在使用 JSR-303 验证表单时使用 I18n 消息的主要内容,如果未能解决你的问题,请参考以下文章

JSR 303 Bean 验证 + Javascript 客户端验证

JSR-303

学习SpringMVC必知必会~springmvc的数据校验表单标签文件上传和下载

如何在非必填字段 JSR 303 上使用 @Pattern

003-JSR303校验

JSR303校验