2011-07-06 77 views
2

我知道這個問題在論壇的很多帖子中都有討論,但是我仍然遇到了定製bean驗證消息的問題。也許在配置或文件位置丟失一些小東西...JSF2:使用自定義消息包進行bean驗證

當驗證調用消息時,網頁顯示消息ID而不是消息文本。

例如我在網頁中看到{messages.myMessageId}

我有:

的src/COM/MyApp的/視圖/ validationvalidation_en.poperties

webuser_name_notnull = Name is required 

面-config.xml

<message-bundle> 
     com.myapp.view.validation 
</message-bundle> 

webuser.java

@NotNull(message = "{webuser_name_notnull}") 
private String name; 

非常感謝支持!

回答

8

由於每JSR303 specification的4.3.1.1章節,自定義JSR303驗證消息文件需要具有完全相同的名稱ValidationMessages.properties,它需要被這樣直接在src文件夾放置在classpath的根目錄,你的情況。

請注意,Bean驗證不是JSF的一部分。它是Java EE的一部分,JSF也是其中的一部分。 JSF <message-bundle>僅定義JSF默認驗證消息的位置(例如您在required="true"上看到的消息),而不是JSR303 Bean驗證消息。

2

您可以使用MessageInterpolator。如果使用休眠試試這個

public class ResourceBundleMessageInterpolator extends org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator implements 
    MessageInterpolator { 

    @Override 
    public String interpolate(String message, Context context, Locale locale) { 
    // evaluate el expression 
    if (message != null && message.startsWith("#{")) { 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 
     Application app = facesContext.getApplication(); 
     ExpressionFactory elFactory = app.getExpressionFactory(); 
     ELContext elContext = facesContext.getELContext(); 
     ValueExpression valueExp = elFactory.createValueExpression(elContext, message, Object.class); 
     Object value = valueExp.getValue(elContext); 
     if (value == null) { 
     return null; 
     } else { 
     return value.toString(); 
     } 
    } else { 
     return super.interpolate(message, context, locale); 
    } 
    } 
} 

最後,您需要META-INF/validation.xml中

<?xml version="1.0" encoding="UTF-8"?> 
<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"> 
     <message-interpolator>package.ResourceBundleMessageInterpolator</message-interpolator> 
</validation-config>