我的应用程序是完全配置的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同样的结果。
我错过了什么?
答案 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;
}
}