2011-07-06 48 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>