Вы могли бы сделать это.Я также реализовал это в некоторых проектах.Это только добавляет (незначительные) накладные расходы.Для этой конкретной цели вы также можете просто использовать файл тегов Facelets вместо составного компонента JSF.Тогда не обязательно определять атрибуты.В вашем конкретном случае вы можете в значительной степени дублировать дубликаты, если повторно используете имя свойства компонента в качестве идентификатора и ключ для метки пакета сообщения.
Например
<my:input type="text" bean="#{userBean}" property="userId" required="true" />
<my:input type="secret" bean="#{userBean}" property="password" required="true" />
со следующим в файле тегов Facelets:
<c:set var="id" value="#{not empty id ? id : property}" />
<c:set var="required" value="#{not empty required and required}" />
<c:choose>
<c:when test="#{type == 'text'}">
<h:inputText id="#{id}"
label="#{msgs[property]}"
value="#{bean[property]}"
size="#{config.size(id)}"
maxlength="#{config.maxlength(id)}"
required="#{required}" />
</c:when>
<c:when test="#{type == 'secret'}">
<h:inputSecret id="#{id}"
label="#{msgs[property]}"
value="#{bean[property]}"
size="#{config.size(id)}"
maxlength="#{config.maxlength(id)}"
required="#{required}" />
</c:when>
<c:otherwise>
<h:outputText value="Unknown input type: #{type}" />
</c:otherwise>
</c:choose>
Однако я реализовал его с <h:outputLabel>
до и <h:message>
после, что делает рефакторинг, подобный этому, более разумным.