2

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

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

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

我有:

src/com/myapp/view/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;

非常感谢您的支持!

4

2 回答 2

10

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

请注意,Bean Validation 不是 JSF 的一部分。它是 Java EE 的一部分,JSF 也是其中的一部分。JSF<message-bundle>只定义 JSF 默认验证消息的位置(例如您在 上看到required="true"的那个),而不是 JSR303 Bean Validation 消息。

于 2011-07-06T09:19:01.170 回答
3

您可以使用 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>
于 2011-09-08T13:38:47.253 回答