Pergunta
Eu tenho um problema com JSF. Alguém pode dizer por que isso não funciona?
<h:selectOneListbox
id="lang" size="5"
value="#{MbInstitution.node.lang}"
valueChangeListener="#{MbInstitution.changeLanguage}"
rendered="#{MbInstitution.view}"
>
<a4j:support event="onchange" reRender="shortDesc, fullDesc"/>
<f:selectItems value="#{MbInstitution.languagesByInstitute}"/>
</h:selectOneListbox>
<h:selectOneListbox
id="lang" size="5"
disabled="#{!MbInstitution.managingNew}"
value="#{MbInstitution.node.lang}"
rendered="#{!MbInstitution.view}"
>
<f:selectItems value="#{MbInstitution.availableLanguages}"/>
</h:selectOneListbox>
Ele diz: "duplicar Id para uma instForm componente: lang" Eu sei que eu tenho 2 elementos com o mesmo Id, mas um é processado somente quando outro não é. Então, eu não acho que seria um problema. Na verdade, não é um grande problema em tudo como eu não preciso disso id, mas o que se eu precisava então o que eu faço?
Solução
Seu problema é que esses dois componentes são parte da árvore JSF componente para esta página. E mesmo se eles não podem ser exibidos ao mesmo tempo, eles compartilham o mesmo ID, o que não é permitido pelo JSF.
Eu vejo três soluções para resolver o problema:
Primeira solução: Definir dois diferentes ID
Segunda solução:. Você pode, como explicado por Wayne Young, usar um NamingContainer, que irá anteceder a sua ID pelo ID do NamingContainer
Terceiro solução:. Use apenas um <h:selectOneListbox/>
e, em seguida, fazer a diferença no código Java
<h:selectOneListbox id="lang" size="5" disabled="#{!MbInstitution.managingNew}" value="#{MbInstitution.node.lang}" valueChangeListener="#{MbInstitution.changeLanguage}">
<a4j:support event="onchange" reRender="shortDesc, fullDesc" rendered="#{MbInstitution.view}"/>
<f:selectItems value="#{MbInstitution.languages}"/>
</h:selectOneListbox>
código Java:
public List<SelectItem> getLanguage() {
if (isView()) {
return getLanguagesByInstitute();
} else {
return getAvailableLanguages();
}
}
public void changeLanguage(ValueChangeEvent evt) {
if (!isView()) {
return;
}
...
}
Outras dicas
Você vai ter que usar um ID diferente ou colocá-lo em outro contêiner de nomeação.
O Javadoc para UIComponent.setId () diz:
A especificado identificador deve ser único entre todos os componentes (Incluindo facetas) que são descendentes do ancestral mais próximo UIComponent que é um NamingContainer, ou no âmbito do todo árvore de componentes, se não existe ancestral que é um NamingContainer.