Probleme mit Facelets und if foreach und when

thajek

Grünschnabel
Hallo ich habe folgende Problem:

Kurz zum aufbau ich habe eine list mit SearchType objecten diese iteriere ich mit eine c:foreach schleife durch. In der foreach schleife frage ich mit c:if oder c:when den type ab und verändere demensprechen das ausehen.
Die JSF läuft als portlet in einem BenutzerPortal von Novell

und zwar wird die anzeige durch die c:foreach und c:if variable generiert wenn ich nun zwei inputText habe und einen davon lösche kommt es zu einem fehler und zwar wird die variable i zwar in der foreach schleife richtig hochgezählt aber im c:when block nochmals um einen inkrementiert. Dies geschieht allerdings nur wenn ich ein inputText lösche das ein nicht String type hatte.

Das heisst ich füge ein neue h:inputText hinzu welches an ein Date object gebunden wird, nun lösche ich den h:inputText der über diesen ist. Intern (durch Debuggen getestet) kommt es zu keinen fehler die Liste mit den Objecten wird richtig veringert. Doch troztdem kommt es zu dem Fehler das die variable i in den c:while oder eben c:if um eins höher ist als sie sein sollten

Das komische ist es passiert nur wenn der h:inputText (der keine String bindung hat) unterhalb des inputTextes ist. Zudem kommt dieses problem nicht vor wenn ich die h:inputText nur mit String objecten Binde

Wenn ich mir die variable i ausgeben lasse wird sie wie folgt ausgegeben

Ablauf
foreach i = 0
when i = 1
danach wieder i=0

auserhalb von when ist die variable i so wie sie sein sollte

es sieht auch so aus als ob das ein problem vom Framework ist

In der Klasse search (ein kleiner teil)
Code:
public void deleteSearch(int item)
   {
      list.remove(item);
   }
   public void addSearch()
   {
      SearchType tempSearchType;
      String tempType = getTypeByName(newAttribute);
      Attribute tempAttr = getAttributeByName(newAttribute);
      if(tempType.equals("date") || tempType.equals("unixtimestamp"))
      {
         tempSearchType = new SearchType(new Date(),tempAttr,"=var");
      }
      else if(tempType.equals("boolean"))
      {
         tempSearchType = new SearchType(Boolean.valueOf(false),tempAttr,"=var*");
      }
      else if(tempType.equals("int"))
      {
         tempSearchType = new SearchType(Integer.valueOf(0),tempAttr,"=var*");
      }
      else
      {
         tempSearchType = new SearchType("test",tempAttr,"=var*");
      }
      list.add(tempSearchType);
   }
In der Klasse searchType (ein kleiner teil)
Code:
   public String getString()
   {
      if(attr instanceof String)
      {
         return (String) attr;
      }
      else
      {
         return null;
      }
   }
   
   public Date getDate()
   {
      if(attr instanceof Date)
      {
         return (Date) attr;
      }
      else
      {
         return null;
      }
   }
list.jsp
Code:
 <h:panelGrid columns="4" >
         <c:forEach begin="0" end="#{controller.search.searchSize}" var="i" >
               <c:set value="#{controller.search.list[i]}" var="search"/>
               <c:set value="#{search.attribute.type}" var="type"/>
             <c:choose>
               <c:when test="#{type == 'int'}">
                  <h:inputText value="#{search.int}"/>
                  <h:outputText value="#{search.attribute.displayName}" />
                  <h:selectOneMenu  value="#{search.criterion}">
                           <f:selectItems value="#{search.criterionByType}" />
                  </h:selectOneMenu>
                  <h:commandButton class="goeUserInPortletCommandButton"  id="searchDelete#{i}"  value="löschen"
                     actionListener="#{controller.deleteSearch}"/>
               </c:when>
               <c:when test="#{type == 'boolean'}">
                  <h:inputText value="#{search.boolean}"/>
                  <h:outputText value="#{search.attribute.displayName}" />
                  <h:selectOneMenu  value="#{search.criterion}">
                           <f:selectItems value="#{search.criterionByType}" />
                  </h:selectOneMenu>
                  <h:commandButton class="goeUserInPortletCommandButton"  id="searchDelete#{i}" value="löschen"
                     actionListener="#{controller.deleteSearch}"/>
               </c:when>
               <c:when test="#{type == 'date' or type == 'unixtimestamp'}">
                  <t:inputDate
                        value="#{search.date}" popupCalendar="false">
                  </t:inputDate>
                  <h:inputText value="#{controller.search.list[i].date}"/>
                  <h:selectOneMenu  value="#{search.criterion}">
                           <f:selectItems value="#{search.criterionByType}" />
                  </h:selectOneMenu>
                  <h:outputText value="#{controller.search.list[i].attribute.displayName}" />
                  <h:commandButton class="goeUserInPortletCommandButton"  id="searchDelete#{i}" value="löschen"
                     actionListener="#{controller.deleteSearch}"/>
               </c:when>
               <c:when test="#{type == 'string'}">
                  <h:inputText value="#{search.string}"/>
                  <h:selectOneMenu  value="#{search.criterion}">
                     <f:selectItems value="#{search.criterionByType}"/>
                  </h:selectOneMenu>
                  <h:outputText value="#{search.attribute.displayName}">
                  </h:outputText>
                  <h:commandButton class="goeUserInPortletCommandButton"  id="searchDelete#{i}"  value="löschen" actionListener="#{controller.deleteSearch}"/>
               </c:when>
            </c:choose>
               </c:forEach>
          <h:selectOneMenu id="searchtype" value="#{controller.search.linkage}">
            <f:selectItem itemValue="and" itemLabel="AND" />
            <f:selectItem itemValue="or" itemLabel="OR" />
         </h:selectOneMenu>
         <h:selectOneMenu value="#{controller.search.newAttribute}">
            <f:selectItems value="#{controller.selectAttributes}" />
         </h:selectOneMenu>
         <h:commandButton class="goeUserInPortletCommandButton" disabled="#{editable}" value="hinzufügen"
                              actionListener="#{controller.addSearch}"/>
         <h:commandButton class="goeUserInPortletCommandButton" action="#{controller.searchUsers}" value="Suchen" />               
      
</h:panelGrid>
 

Neue Beiträge

Zurück