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 ответ
Проблема может быть разделена на две части:
Как переопределить сообщение об ошибке фреймворка?
Каков список всех возможных сообщений об ошибках, которые могут быть сгенерированы структурой 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
К сожалению, учитывая огромное количество классов, для которых должны быть предоставлены сообщения об ошибках, я не считаю это возможным решением.
ОБНОВИТЬ
Я только что понял, почему должны предоставляться только сообщения об ошибках преобразования и проверки: потому что они связаны с пользовательским вводом, который программист не может контролировать. Все другие ошибки, такие как проблемы, связанные с навигацией, должны корректно обрабатываться программистом. Такие ошибки не должны появляться в первую очередь, поэтому нет смысла переводить эти сообщения в любом случае.