JSF2: проверка бина с пользовательским пакетом сообщений - PullRequest
2 голосов
/ 06 июля 2011

Я знаю, что эта проблема обсуждается во многих сообщениях на форуме, однако мне все еще не удается настроить сообщения для проверки бина. Может быть, некоторые мелочи отсутствуют в конфигурации или расположении файла ...

Когда проверка вызывает сообщение, вместо текста сообщения на веб-странице отображается идентификатор сообщения.

Например, я вижу на веб-странице {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;

Большое спасибо за поддержку!

Ответы [ 2 ]

10 голосов
/ 06 июля 2011

В соответствии с главой 4.3.1.1 спецификации JSR303 , пользовательский файл сообщений проверки JSR303 должен иметь точное имя ValidationMessages.properties, и он должен быть помещен в корень пути к классам, в вашем Таким образом, непосредственно в папке src.

Обратите внимание, что Bean Validation не является частью JSF. Это часть Java EE, частью которой также является JSF. JSF <message-bundle> определяет только расположение сообщений проверки JSF по умолчанию (например, сообщения, которые вы видите на required="true"), но не сообщения проверки bean-компонента JSR303.

3 голосов
/ 08 сентября 2011

Вы можете использовать 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>
...