Hibernate验证器在运行时更改区域设置

tgabmvqs  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(166)

我用hibernate做了一个应用程序,并使用注解来进行验证。我意识到,要将消息翻译成我的语言,我必须在resources文件夹中放入一个名为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
            }
            
            ....
        }
p8ekf7hl

p8ekf7hl1#

默认语言环境(例如ValidationMessage.properties)可以是您想要的任何语言,这完全是特定于应用程序的。因为我说英语,我倾向于让该文件包含基于英语的翻译,并根据需要扩展到其他语言。
至于选择适当的语言环境,您需要提供一种方法,将该值从应用程序层向下传递到验证框架。
例如,您的应用程序可以设置一个线程局部变量或使用LocalContextHolder(如果您使用spring),这将允许您设置一个线程特定的Locale,您可以在代码中静态访问下游。
在我过去的经验中,我们通常有一个单独的资源包,我们希望在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}.

希望能有所帮助。

相关问题