在使用 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/messages
在i18n
子目录中找到该代码)。
示例验证器代码:
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 客户端验证