2016-08-05 50 views
3

我用hibernate創建了一個應用程序,並使用註釋來執行驗證。 我意識到要將消息翻譯成我的語言,我必須在資源文件夾中放入一個名爲ValidationMessage_xx.properties的文件。問題是,什麼應該是默認的語言,但我必須給遊客更改網站的語言的選項,因此也是驗證的類休眠驗證器在運行時更改語言環境

添加代碼,我使用驗證

類的例子{

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

    public String getFieldOne(){ 
     return fieldOne; 
    } 

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

    .... 
} 

回答

2

默認區域(如ValidationMessage.properties)可以是你希望它是任何語言,這是完全專用的。因爲我會說英語,所以我傾向於讓該文件包含基於英文的翻譯,並根據需要擴展到其他語言。

至於選擇適當的區域設置選擇,您將需要提供一種將值從應用程序層下游傳遞到驗證框架的方法。

例如,您的應用程序可以設置一個線程局部變量,如果你使用Spring,這將允許您設置特定Locale一個線程可以訪問靜態下游在代碼中使用LocalContextHolder

在過去的經驗中,我們通常有一個資源包,我們希望在與控制器和服務共享的bean驗證中使用。我們提供bean驗證解析器實現,該解析器實現根據線程局部變量加載該資源包,並以這種方式公開國際化消息。

A提供例如:

// 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()); 
    } 
} 

下一個步驟是你需要提供ContextualMessageInterpolator實例Hibernate的驗證。這可以通過創建validation.xml並將其放置在類路徑根目錄下的META-INF中來完成。在網絡應用程序中,這將是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}. 

希望有幫助。

+0

請問您可以添加鏈接到示例?我有一個私人領域和getter和setter類。我將限制應用於字段。我如何設置區域設置?我編輯我的問題並添加簡單的類。謝謝 – ciro