【问题标题】:JSF2: bean validation with custom message bundleJSF2:使用自定义消息包进行 bean 验证
【发布时间】:2011-09-29 10:43:37
【问题描述】:

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

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

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

我有:

src/com/myapp/view/validationvalidation_en.poperties

webuser_name_notnull = Name is required

faces-config.xml

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

webuser.java

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

非常感谢您的支持!

【问题讨论】:

    标签: java bean-validation message-bundle


    【解决方案1】:

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

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

    【讨论】:

    • 有没有办法让 ValiationMessages.properties 不在类路径的根目录下?我正在处理的这个遗留应用程序中的所有其他消息包都在 /msgs 目录@BalusC
    【解决方案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>
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2011-08-09
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2022-11-02
      相关资源
      最近更新 更多