2 Replies Latest reply on Nov 10, 2009 3:03 PM by Fabio Montezuma

    Weird behaviour when submit using @Out property

    Fabio Montezuma Newbie

      Hi!


      I´m having problems when I try to set a value to my bean.


      I want to set the current classification value to it, but somehow it's having a weird behavior.


      Here is the code:


      @Name("classificacaoAction")
      @Scope(ScopeType.CONVERSATION)
      public class ClassificacaoAction
      {
           @In(create = true)
           private List<SofClassificacao> listaClassificacoes;
           
           @Out(required = false)
           private SofClassificacaoRomaneio classificacaoAtual;
           
           @In
           private GerenciarRomaneioAction sofGerenciarRomaneioAction;
           
           @Out
           private SofRomaneio romaneio;
                
           @Factory(value = "romaneio", autoCreate = true)
           public void carregarRomaneio()
           {          
                romaneio = sofGerenciarRomaneioAction.getRomaneio();
                
                // inicializa classificacoes
                if (romaneio.getSofClassificacaoRomaneios().isEmpty())
                {
                     romaneio.setSofClassificacaoRomaneios(new LinkedHashSet<SofClassificacaoRomaneio>());
                     Set<SofClassificacaoRomaneio> lista = romaneio.getSofClassificacaoRomaneios();
                     
                     for (SofClassificacao classificacao : listaClassificacoes)
                     {
                          SofClassificacaoRomaneio classificacaoRomaneio = new SofClassificacaoRomaneio();
                          classificacaoRomaneio.setSofRomaneio(romaneio);
                          classificacaoRomaneio.setSofClassificacao(classificacao);
                          classificacaoRomaneio.setPcDesconto(BigDecimal.ONE);
                          lista.add(classificacaoRomaneio);
                     }
                }
                classificacaoAtual = romaneio.getSofClassificacaoRomaneios().iterator().next();
           }     
                
           public void proximaClassificacao()
           {
                if (classificacaoAtual != null)
                {
                     Integer classificacaoAtualId = classificacaoAtual.getId().getCdClassificacao();
                     
                     Iterator<SofClassificacaoRomaneio> i = romaneio.getSofClassificacaoRomaneios().iterator();
                     SofClassificacaoRomaneio cr = i.next(); // 1o valor - nunca será satisfatório
                     
                     while (i.hasNext() && cr.getId().getCdClassificacao() <= classificacaoAtualId) 
                     { 
                          cr = i.next();
                     }
                     
                     if (cr.getId().getCdClassificacao() > classificacaoAtualId)
                     {
                          classificacaoAtual = cr;
                     }
                     else
                     {
                          classificacaoAtual = null;
                     }
                }
           }          
      }



      And the page (it is included in another page, there is a form around it):


      <rich:tab label="Classificação" id="gr-aba-classificacao"
          xmlns="http://www.w3.org/1999/xhtml"
          xmlns:ui="http://java.sun.com/jsf/facelets"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:s="http://jboss.com/products/seam/taglib"
          xmlns:a="http://richfaces.org/a4j"
          xmlns:rich="http://richfaces.org/rich">
           
           <s:div id="classif-romaneio" rendered="#{editarRomaneio}">
           
                <s:decorate id="classificacaoAtualField" template="layout/custom-edit.xhtml" rendered="#{classificacaoAtual != null}">
                     <ui:define name="label">#{classificacaoAtual.sofClassificacao.dsClassificacao}</ui:define>
                     <h:inputText value="#{classificacaoAtual.psDesconto}" />               
                </s:decorate>
                
                <a:commandButton action="#{classificacaoAction.proximaClassificacao}" value="Salvar" rendered="#{classificacaoAtual != null}">
                     <a:support event="oncomplete" reRender="classif-romaneio, tblClassificacoes" />
                </a:commandButton>
                
           </s:div>
                
           <rich:dataTable id="tblClassificacoes" 
                value="#{romaneio.sofClassificacaoRomaneios.toArray()}" var="_classif">
                <rich:column>
                     <f:facet name="header">Descricao</f:facet>
                     <h:outputText value="#{_classif.sofClassificacao.dsClassificacao}" />
                </rich:column>
                <rich:column>
                     <f:facet name="header">PS-Desconto</f:facet>
                     <h:outputText value="#{_classif.psDesconto}" />
                </rich:column>
                <rich:column>
                     <f:facet name="header">PC-Desconto</f:facet>
                     <h:outputText value="#{_classif.pcDesconto}" />
                </rich:column>
                
                <a:support event="onRowClick" action="#{classificacaoAction.setClassificacaoAtual(_classif)}" 
                     reRender="classif-romaneio"  rendered="#{editarRomaneio}"/>
                
           </rich:dataTable>
      </rich:tab>



      When I click the button it's calling the proximaClassificacao method but the classificacaoAtual property still have the old value (looking at debug). After the reRender I can see that the old classificacaoAtual and the new classificacaoAtual, both have the value that I typed in the input text.


      Any clue of what´s happening?


      Thanks in advance.