Java JSF2:使用自定义消息包进行bean验证

Java JSF2:使用自定义消息包进行bean验证,java,bean-validation,message-bundle,Java,Bean Validation,Message Bundle,我知道这个问题在论坛的许多帖子中都有讨论,但是我仍然在为bean验证定制消息时遇到问题。可能在配置或文件位置中缺少一些小东西 当验证调用消息时,网页显示消息ID而不是消息文本 例如,我在网页{messages.myMessageId}中看到 我有: src/com/myapp/view/validationvalidation\u en.poperties webuser_name_notnull = Name is required faces config.xml <message-

我知道这个问题在论坛的许多帖子中都有讨论,但是我仍然在为bean验证定制消息时遇到问题。可能在配置或文件位置中缺少一些小东西

当验证调用消息时,网页显示消息ID而不是消息文本

例如,我在网页{messages.myMessageId}中看到

我有:

src/com/myapp/view/validationvalidation\u en.poperties

webuser_name_notnull = Name is required
faces config.xml

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

非常感谢您的支持

根据的第4.3.1.1章,自定义JSR303验证消息文件需要具有准确的名称
ValidationMessages.properties
,并且需要将其放置在类路径的根目录中,在您的情况下,直接放在
src
文件夹中


请注意,Bean验证不是JSF的一部分。它是JavaEE的一部分,JSF也是JavaEE的一部分。JSF
只定义JSF默认验证消息的位置(例如您在
required=“true”
上看到的消息),而不是JSR303 Bean验证消息。

您可以使用MessageInterpolator。如果你使用hibernate,试试这个

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>

package.ResourceBundleMessageInterpolator

是否无法使ValiationMessages.properties不在类路径的根目录下?我正在处理的这个遗留应用程序中的所有其他消息包都位于/msgs目录@BalusC中
<?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>