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

时间:2016-01-19 14:05:49

标签: java spring validation internationalization

我的应用程序是完全配置的spring-boot应用程序,带有百万美元模板引擎。我也配置了I18n,所以我可以在我的模板中使用它。这是我使用的配置:

spring.messages.basename=i18n/messages

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

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

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

{some.i18n.code}

我试过了this solution - 没有结果。 This on同样的结果。

我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

@Autowired
private MessageSource messageSource;

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

     return validatorFactoryBean;
}

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

答案 1 :(得分:0)

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

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

由于进行了声明,现在正在我的messages.properties中搜索来自我的自定义验证程序的自定义错误代码(通过声明i18n也可以在我的spring.messages.basename=i18n/messages子目录中搜索该错误代码)。

验证器代码示例:

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;
  }
}