К сожалению, атрибуты requiredMessage
(и validatorMessage
и 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));
}
}