JSF настроить все сообщения об ошибках

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

Есть ли файл, который содержит все возможные сообщения об ошибках?

До сих пор я натолкнулся на файл Messages.properties, расположенный в jsf-api jar, который содержит сообщения об ошибках Validation, Converter и Component. Но этого недостаточно, кроме них есть множество других ошибок.

Этот jar- файл на самом деле называется jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.jar и находится в папке jboss-eap\modules\system\layer \base\javax\face \api\main.
Внутри этого jar файл Messages.properties находится в пакете javax \ Faces.

В настоящее время я использую Red Hat JBoss Enterprise Application Platform - Версия 6.4.0.GA, JSF-версия реализации: 2.1.28.Final-redhat-1

1 ответ

Проблема может быть разделена на две части:

  1. Как переопределить сообщение об ошибке фреймворка?

  2. Каков список всех возможных сообщений об ошибках, которые могут быть сгенерированы структурой JSF?

Часть 1: СООБЩЕНИЯ ОБ ОШИБКЕ ПЕРЕГРУЗКИ

В моем проекте в WebContent\WEB-INF есть файл face-config.xml, который содержит <message-bundle>resources</message-bundle>, 'resources' указывает на src\resources.properties. В этом файле.properties мне просто нужно добавить соответствующие записи, как

javax.faces.converter.DateTimeConverter.DATE={2}: ''{0}'' non poteva essere inteso come una data.

Если приложение сгенерирует такую ​​ошибку, будет отображено переведенное сообщение. Однако, как я понимаю из сообщения об ошибке проверки не может переопределить, использование файла resources.properties в src зависит от конкретного производителя. Различные технологии упаковки могут потребовать разных решений.

Часть 2: СПИСОК ВСЕХ СООБЩЕНИЙ ОБ ОШИБКАХ

Взглянув на файлы, содержащиеся в javax.faces.jar http://www.java2s.com/Code/Jar/j/Downloadjavaxfacesjar.htm, я вижу следующие пакеты:

  • javax.faces.application

  • javax.faces.bean

  • javax.faces.component

  • javax.faces.context

  • javax.faces.convert

  • javax.faces.el

  • javax.faces.event

  • javax.faces.lifecycle

  • javax.faces.model

  • javax.faces.render

  • javax.faces.validator

  • javax.faces.view

  • javax.faces.webapp

Для каждого класса в каждом из этих пакетов я должен добавить записи в resources.properties для каждой ошибки, которую может вызвать этот класс. Но какие ошибки могут возникнуть в классе? А как должна выглядеть запись в resource.properties?

Я позволю себе руководствоваться записями, которые я нашел в файле Messages.properties внутри jboss-jsf-api_2.1_spec-2.1.28.Final-redhat-1.банка (которую я упомянул в вопросе). Он имеет следующие записи, среди многих других:

# ==============================================================================
# Component Errors
# ==============================================================================
javax.faces.component.UIInput.CONVERSION={0}: Conversion error occurred.
javax.faces.component.UIInput.REQUIRED={0}: Validation Error: Value is required.
javax.faces.component.UIInput.UPDATE={0}: An error occurred when processing your submitted information.

В моей IDE (eclipse) я нажимаю на оператор импорта import javax.faces.component.UIInput; перейти к UIInput.класс В редакторе файлов классов у меня есть следующие строки:

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String CONVERSION_MESSAGE_ID = "javax.faces.component.UIInput.CONVERSION";

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String REQUIRED_MESSAGE_ID = "javax.faces.component.UIInput.REQUIRED";

  // Field descriptor #193 Ljava/lang/String;
  public static final java.lang.String UPDATE_MESSAGE_ID = "javax.faces.component.UIInput.UPDATE";

Я отмечаю, что значение поля String является именно тем ключом, который должен быть добавлен в resources.properties, например, javax.faces.component.UIInput.CONVERSION.

Для нового класса, такого как, например, класс javax.faces.validator.RegexValidator, я сделаю следующее: откройте его в редакторе файлов классов, выберите те поля, имя которых заканчивается на _ID, например:

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String VALIDATOR_ID = "javax.faces.RegularExpression";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String PATTERN_NOT_SET_MESSAGE_ID = "javax.faces.validator.RegexValidator.PATTERN_NOT_SET";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String NOT_MATCHED_MESSAGE_ID = "javax.faces.validator.RegexValidator.NOT_MATCHED";

  // Field descriptor #30 Ljava/lang/String;
  public static final java.lang.String MATCH_EXCEPTION_MESSAGE_ID = "javax.faces.validator.RegexValidator.MATCH_EXCEPTION";

и добавьте следующие записи в файл resources.properties:

javax.faces.RegularExpression=custom message
javax.faces.validator.RegexValidator.PATTERN_NOT_SET=custom message
javax.faces.validator.RegexValidator.NOT_MATCHED=custom message
javax.faces.validator.RegexValidator.MATCH_EXCEPTION=custom message

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

ОБНОВИТЬ

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

Другие вопросы по тегам