本月早些时候,我们发布了Hibernate Validator 6.1.1.Final版本,该版本包含了一些对本地化支持的改进。
这是对使用Hibernate Validator的每个人的推荐升级,并且它是6.1.0.Final的替代品。
新特性
本地化支持改进
Hibernate Validator始终考虑本地化构建,但如果我们有几种语言的约束违反消息的翻译,那么在您的应用程序中支持验证需要使用自定义的MessageInterpolator
来解决您想要使用的区域设置并委托给默认值。否则,Hibernate Validator将简单地使用系统的默认区域设置。
这并不非常实用,6.1.1.Final引入了一个特定的SPI来更灵活地处理本地化:LocaleResolver
。
一个很好的LocaleResolver
例子是我们现在在Quarkus中拥有的。它使用ResteasyContext
从请求中提取Accept-Language
头并使用最佳区域设置。
public class ResteasyContextLocaleResolver implements LocaleResolver {
@Override
public Locale resolve(LocaleResolverContext context) {
Optional<List<LanguageRange>> localePriorities = getAcceptableLanguages();
if (!localePriorities.isPresent()) {
return context.getDefaultLocale();
}
List<Locale> resolvedLocales = Locale.filter(localePriorities.get(), context.getSupportedLocales());
if (resolvedLocales.size() > 0) {
return resolvedLocales.get(0);
}
return context.getDefaultLocale();
}
private Optional<List<LanguageRange>> getAcceptableLanguages() {
HttpHeaders httpHeaders = ResteasyContext.getContextData(HttpHeaders.class);
if (httpHeaders != null) {
List<String> acceptLanguageList = httpHeaders.getRequestHeader("Accept-Language");
if (acceptLanguageList != null && !acceptLanguageList.isEmpty()) {
return Optional.of(LanguageRange.parse(acceptLanguageList.get(0)));
}
}
return Optional.empty();
}
}
要使用此LocaleResolver
,请按以下方式初始化您的ValidatorFactory
ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class)
.configure()
.localeResolver(yourLocaleResolver)
.locales(Locale.ENGLISH, Locale.GERMAN, Locale.FRENCH, Locale.ITALIAN)
.defaultLocale(Locale.FRENCH)
.buildValidatorFactory();
有几个需要注意的地方
-
您需要传递您想要支持的区域设置列表,即您有适当翻译的约束消息的区域设置;
-
您可以定义一个不同于系统默认区域设置的默认区域设置。
这个新的SPI仍在孵化中,所以请试用并给我们反馈!
完整的变更日志
可以在这里找到已解决的问题的完整列表:我们的JIRA。
获取6.1.1.Final
要使用Maven,Gradle等获取此版本,请使用以下GAV坐标
-
org.hibernate.validator:hibernate-validator:6.1.1.Final
-
org.hibernate.validator:hibernate-validator-cdi:6.1.1.Final
-
org.hibernate.validator:hibernate-validator-annotation-processor:6.1.1.Final
注意,组ID已从org.hibernate
(Hibernate Validator 5及之前版本)更改为org.hibernate.validator
(从Hibernate Validator 6开始)。
如果您想从本版本的WildFly新功能中受益,我们还提供了针对WildFly 18和WildFly 17.0.1的WildFly补丁。您可以在此处了解如何应用这些补丁。
反馈、问题、想法?
要取得联系,请使用常规渠道
-
用户论坛(使用问题、一般反馈)
-
问题跟踪器(错误报告、功能请求)
-
邮件列表(与开发相关的讨论)
-
Bean Validation开发邮件列表(关于Bean Validation规范的讨论)