PassThroughAttribute для SubComponent внутри JSF Composite Component
Я знаю, что следующий пример работает. Атрибут id будет передан компоненту h:link и используется для построения URL (например, /model/{id}).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:cc="http://xmlns.jcp.org/jsf/composite"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<cc:interface>
<cc:attribute name="outcome" type="java.lang.String" />
<cc:attribute name="href" type="java.lang.String" />
<cc:attribute name="value" type="java.lang.String" />
<cc:attribute name="icon" type="java.lang.String" />
</cc:interface>
<cc:implementation>
<li class="#{prettyHelper.comparePrettyMappingIds(prettyContext.currentMapping.id, cc.attrs.outcome) ? 'active' : ''}">
<h:link outcome="#{cc.attrs.outcome}" href="#{cc.attrs.href}" title="#{cc.attrs.value}">
<f:passThroughAttribute name="data-tooltip" value="tooltip" />
<f:passThroughAttribute name="data-placement" value="right" />
<c:if test="${cc.attrs.icon != null}">
<i class="#{cc.attrs.icon}"></i>
</c:if>
<c:if test="${cc.attrs.value != null}">
<span><h:outputText value="#{cc.attrs.value}" /></span>
</c:if>
<cc:insertChildren />
</h:link>
</li>
</cc:implementation>
</html>
<...:link outcome="pretty:detail" icon="fa fa-pencil" value="Detail">
<f:param name="id" value="#{bean.id}" />
</...:link>
Но этот пример не работает. Зачем?
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://xmlns.jcp.org/jsf/composite"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<cc:interface>
<cc:attribute name="id" type="java.lang.String" />
<cc:attribute name="value" type="java.lang.String" />
<cc:attribute name="style" type="java.lang.String" />
<cc:attribute name="styleClass" default="form-control form-control-sm" type="java.lang.String" />
<cc:attribute name="required" default="false" type="boolean" />
</cc:interface>
<cc:implementation>
<h:inputText id="#{cc.attrs.id}" value="#{cc.attrs.value}"
required="#{cc.attrs.required}"
styleClass="#{cc.attrs.styleClass} #{ component.valid ? '' : 'is-invalid'}"
style="#{cc.attrs.style}">
<cc:insertChildren />
</h:inputText>
</cc:implementation>
</html>
<...:simpleInput id="name" label="Name:"
value="#{bean.name}">
<f:passThroughAttribute name="autofocus" value="autofocus" />
<f:passThroughAttribute name="placeholder"
value="Name..." />
</...:simpleInput>
В первом примере атрибут f: param передается компоненту h:link. Во втором примере атрибуты f:passThroughAttribute не передаются в компонент h:inputText. Я создал обходной путь, передав карту атрибутов через simpleInput (f:passThroughAttributes). Мне кажется очень грязным настраивать карту атрибутов (внутри bean-компонента) и передавать их через компонент simpleInput.
public Map<String, Object> attributes() {
return MapUtils.asMap(MapUtils.entry("placeholder", "Name..."));
}
<...:simpleInput id="name" label="Name:"
value="#{bean.name}" passThroughAttribute="#{bean.attributes}">
</...:simpleInput>
нет другого решения?