gpt4 book ai didi

Hibernate validator 在运行时更改区域设置

转载 作者:行者123 更新时间:2023-12-02 22:27:15 25 4
gpt4 key购买 nike

我用 hibernate 制作了一个应用程序并使用注释进行验证。我意识到要将消息翻译成我的语言,我必须在资源文件夹中放入一个名为 ValidationMessage_xx.properties 的文件。问题是默认语言应该是什么,但我必须为访问者提供更改网站语言以及验证语言的选项

这是我使用 validator 的类的代码:

    class Example {

@NotEmpty
private String fieldOne;
@NotEmpty
private String fieldTwo;

public String getFieldOne(){
return fieldOne;
}

public void setFieldOne(String fieldOne){
this.fieldOne = fieldOne
}

....
}

最佳答案

默认区域设置(例如 ValidationMessage.properties )可以是您想要的任何语言,这完全是特定于应用程序的。因为我说英语,所以我倾向于使该文件包含基于英语的翻译,并根据需要扩展到其他语言。

对于选择适当的区域设置,您需要提供一种将该值从应用程序层下游传递到验证框架的方法。

例如,您的应用程序可以设置一个线程局部变量,或者如果您使用的是 Spring,则可以使用 LocalContextHolder,这将允许您设置一个线程特定的Locale可以在代码中静态访问下游。

根据我过去的经验,我们通常有一个资源包,我们希望在与 Controller 和服务共享的 Bean 验证中使用它。我们提供了 bean 验证的解析器实现,它根据线程局部变量加载资源包并以这种方式公开国际化消息。

提供的示例:

// This class uses spring's LocaleContextHolder class to access the requested
// application Locale instead a ThreadLocal variable. See spring's javadocs
// for details on how to use LocaleContextHolder.
public class ContextualMessageInterpolator
extends ResourceBundleMessageInterpolator {
private static final String BUNDLE_NAME = "applicationMessages";

@Override
public ContextualMessageInterpolator() {
super( new PlatformResourceBundleLocator( BUNDLE_NAME ) );
}

@Override
public String interpolate(String template, Context context) {
return super.interpolate( template, context, LocaleContextHolder.getLocale() );
}

@Override
public String interpolate(String template, Context context, Locale locale) {
return super.interpolate( template, context, LocaleContextHolder.getLocale() );
}
}

下一步是您需要向 Hibernate Validator 提供 ContextualMessageInterpolator 实例。这可以通过创建 validation.xml 并将其放置在类路径根目录下的 META-INF 中来完成。在 Web 应用程序中,这将是 WEB-INF/classes/META-INF

<validation-config
xmlns="http://jboss.org/xml/ns/javax/validation/configuration"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://jboss.org/xml/ns/javax/validation/configuration"
version="1.1">
<message-interpolator>com.company.ContextualMessageInterpolator</message-interpolator>
</validation-config>

由于我使用 applicationMessages 作为包名称,因此只需创建一个默认的 applicationMessages.properties 文件和后续特定于区域设置的版本,并将验证消息字符串添加到这些属性文件中.

javax.validation.constraints.NotNull.message=Field must not be empty.
javax.validation.constraints.Max.message=Field must be less-than or equal-to {value}.
javax.validation.constraints.Min.message=Field must be greater-than or equal-to {value}.

希望有帮助。

关于Hibernate validator 在运行时更改区域设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38793339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com