2016-03-22 17 views
2

Wildfly 8, Jsf 2.2EL-Bedingungsoperator: in Verbundbauteil unerwartetem Verhalten

Wenn Konditionaloperator ? : in Verbundbauteil mit einer Liste in einer c:foreach Schleife verwendet wird, ist sein Verhalten nicht korrekt.

Ausgabe der Beispieldatei ist

eng germ ital 

und nicht als

erwartet
eng eng germ germ ital ital 

Wenn das Verbundbauteil als ui:include neu geschrieben wird oder taglib dann das erwartete Ergebnis kommt.

Datei (test.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:my="http://java.sun.com/jsf/composite/myComp" 
    xmlns:c="http://java.sun.com/jsp/jstl/core"> 

<h:body> 
    <my:testConditionalOperator languagesList="#{['eng', 'germ', 'ital']}"></my:testConditionalOperator> 
</h:body> 
</html> 

Composite-Komponente (testConditionalOperator.xhtml):

<!DOCTYPE html> 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:a="http://xmlns.jcp.org/jsf/passthrough" 
    xmlns:of="http://omnifaces.org/functions" xmlns:f="http://xmlns.jcp.org/jsf/core" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:o="http://omnifaces.org/ui" xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions" 
    xmlns:cc="http://java.sun.com/jsf/composite"> 
    <cc:interface> 
     <cc:attribute name="languagesList"></cc:attribute> 
    </cc:interface> 
    <cc:implementation> 
     <c:forEach var="language" items="#{cc.attrs.languagesList}" > 
      #{fn:length(cc.attrs.languagesList) gt 1 ? language : "a"} 
      <c:if test="#{fn:length(cc.attrs.languagesList) gt 1}"> 
       #{language} 
      </c:if> 
     </c:forEach> 
    </cc:implementation> 
</html> 

Antwort

2

Dies scheint ein Mojarra Fehler zu sein, die in MyFaces nicht offenbar der Fall ist.

Die Arbeit ist, stellen Sie die Größe in end Attribut und verwenden Sie varStatus, um es zu erhalten.

<cc:implementation> 
    <c:forEach var="language" items="#{cc.attrs.languagesList}" end="#{cc.attrs.languagesList.size()}" varStatus="loop"> 
     #{loop.end gt 1 ? language : "a"} 
     <c:if test="#{loop.end gt 1}"> 
      #{language} 
     </c:if> 
    </c:forEach> 
</cc:implementation> 

Notiere die EL 2.2 Fähigkeit nur von fn:length()size() stattdessen verwenden

+0

Vielen Dank! Es ist ein seltsamer Bug. Sollte es über Mojarra berichtet werden? – Tony

+0

Jetzt habe ich komisches Gefühl, bedingt in Composite-Komponenten zu verwenden. – Tony

+0

Ja, bitte. Es ist JSTL Lebenszyklus bezogen. Es funktioniert gut mit ''. – BalusC