【问题标题】:Using I18n messages while validating forms with JSR-303在使用 JSR-303 验证表单时使用 I18n 消息
【发布时间】: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 也是 - 结果相同。

我错过了什么?

【问题讨论】:

    标签: java spring validation internationalization


    【解决方案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;
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2015-07-30
        • 2011-08-09
        • 2018-08-24
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2012-05-12
        • 1970-01-01
        • 2011-08-04
        相关资源
        最近更新 更多