Как параметризовать атрибут requiredMessage в составном компоненте? - PullRequest
3 голосов
/ 14 февраля 2012

BalusC дал хороший ответ на вопрос о том, как устанавливать сообщения для составного компонента. Указание разных сообщений об ошибках для разных составных компонентов Ответ, связанный с использованием пакетов ресурсов для каждого компонента.

Я применил этот подход, но когда я использую {0} в сообщении, чтобы указать текущую метку компонента какчасть сообщения, {0} отображается как в моей ошибке, а не разрешается.Доступно ли это разрешение меток при использовании этого подхода?Или мне нужно вручную создать сообщение об ошибке в составном компоненте?например,

requiredMessage="#{cc.resourceBundleMap.requiredMessage} #{cc.attrs.prefix} #{cc.attrs.label}"

Я предполагаю, что более глубокий вопрос заключается в том, как я могу параметризовать строки сообщений в моем комплекте ресурсов?Нужно ли мне создавать какой-то специальный распознаватель сообщений?

1 Ответ

2 голосов
/ 14 февраля 2012

К сожалению, атрибуты requiredMessagevalidatorMessage и converterMessage) по умолчанию не параметризуются. Я думаю, что в любом случае это не имело бы никакого смысла, поскольку они привязаны к конкретному конкретному компоненту. Составной компонент обычно не содержит кратных одинаковых компонентов. Вам нужно будет указать отдельные сообщения для каждого отдельного компонента.

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

public static String format(String message, Object argument1, Object argument2) {
    return MessageFormat.format(message, argument1, argument2);
}

который будет использоваться примерно так:

requiredMessage="#{util:format(cc.resourceBundleMap.requiredMessage, cc.attrs.prefix, cc.attrs.label)}"

Единственным недостатком является то, что вы не можете создавать EL-функции, которые могут принимать переменные. Это ограничение спецификации EL. Поэтому, если вы хотите передавать переменные аргументы, вам нужно создать отдельную функцию EL и метод Java для каждого возможного количества аргументов.

В качестве совершенно другой альтернативы вы можете создать пользовательский Validator и прикрепить его к определенному компоненту ввода. Вы даже можете поместить метод валидатора прямо в «вспомогательный компонент», который связан с составным компонентом как <cc:interface componentType>. Если вы удалите атрибут required, то этот валидатор будет немедленно вызван, если вы можете свободно создавать сообщения так, как вам хочется.

1025 * Е.Г. *

<h:inputText id="foo" validator="#{cc.validateFoo}" requiredMessage="#{cc.resourceBundleMap.requiredMessage}" />

с

public void validateFoo(FacesContext context, UIComponent component, Object value) {
    if (value == null || value.toString().trim().isEmpty()) {
        String requiredMessage = (String) component.getAttributes().get("requiredMessage");
        String prefix = (String) getAttributes().get("prefix");
        String label = (String) getAttributes().get("label");
        throw new ValidatorException(new FacesMessage(FacesMessage.SEVERITY_ERROR,
            MessageFormat.format(requiredMessage, prefix, label), null));
    }
}
...