Hibernate 验证器中的自定义消息密钥不适用于 message.property

2024-01-02

我正在研究 Spring Boot,我使用 Hibernate Validator 来验证我的 bean。我添加了一个自定义键@NotEmpty注释,并在 message.properties 中添加键/值对,但它没有从 message.property 获取其值

这是我的带有验证注释的 bean:

public class CategoryBean {
    @NotEmpty(message = "{category.name.notempty}")
    private String name;
    ----getter setter-----
}

message.properties(路径:src/main/resources/message.properties)

category.name.notempty=Sorry! Category can't be empty

我还配置了消息资源

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("message");
    return messageSource;
}

我也配置了LocalValidatorFactoryBean

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

每当我验证这个 bean 时,它都会显示它的键而不是它的值。 Hibernate验证器默认搜索消息键里面ValidationMessages.properties所以每当我添加ValidationMessages.properties文件添加消息此键值然后它对我来说工作正常。

但我不想添加 ValidationMessage.properties 文件,而是想在 message.properties 文件中处理此消息键。

我知道堆栈溢出中已经存在一些与此相关的问题,但这些解决方案并不能解决我的问题。我无法找出我在这里做错了什么。


我的解释可能会出错,但我认为 这主要问题为什么您无法解析验证消息密钥NotEmpty与 Spring MessageSource 是 Spring Boot 自动配置ValidationAutoConfiguration.

当您使用 Spring Boot 时,它会添加 org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration ,其中默认验证器组件看起来像这样:

@Bean
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
@ConditionalOnMissingBean(Validator.class)
public static LocalValidatorFactoryBean defaultValidator() {
    LocalValidatorFactoryBean factoryBean = new LocalValidatorFactoryBean();
    MessageInterpolatorFactory interpolatorFactory = new MessageInterpolatorFactory();
    factoryBean.setMessageInterpolator(interpolatorFactory.getObject());
    return factoryBean;
}

正如你所看到的,这个factoryBean使用包含代码的getObject()方法从MessageInterpolatorFactory设置MessageInterpolator:

return Validation.byDefaultProvider().configure()
                .getDefaultMessageInterpolator();

返回默认的 Hibernateorg.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator

所以Validator将使用默认的 HibernateResourceBundleMessageInterpolator解析 ValidationMessages.properties 文件中的验证消息。

如果你想覆盖默认的 HibernateResourceBundleMessageInterpolator有了自己的,你需要把@Primary给你的LocalValidatorFactoryBean:

@Bean
public MessageSource messageSource() {
    final ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
    messageSource.setBasenames("classpath:messages");
    return messageSource;
}

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

然后验证器将使用你的LocalValidatorFactoryBean with MessageSourceResourceBundleLocator解析 messages.properties 文件中的验证消息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate 验证器中的自定义消息密钥不适用于 message.property 的相关文章

随机推荐