[RESOLVIDO] Erro ao acessar List<> a partir de uma propriedade do MB

Galera, por favor, não sei mais o que fazer!

É o seguinte: eu tenho uma tela de detalhes de tratamentos. Cada tratamento tem uma ou mais consultas associadas. Logo eu mostro as informações do tratamento e abaixo uma lista com as consultas.

O meu problema taí!!!

A forma mais lógica para eu conseguir as consultas foi assim:

<p:dataTable value=#{tratamentoBean.tratamento.consultas} var="consulta"...>...</p:dataTable>

Sendo que getConsultas() me retorna um List<>. Até aí tudo bem, os valores são preenchidos normalmente!

Mas dentro do meu dataTable eu quero poder excluir uma consulta!

Então, o que fiz?

<p:column headerText="Ações">
<h:commandLink action=#{consultaBean.excluir()}>
Excluir
<f:setPropertyActionListener target=#{consultaBean.consulta} value="#{consulta}/>
</h:commandLink>
</p:column>

A minha intenção é que quando o usuário clicar em Excluir o método excluir() de consultaBean seja chamado e o atributo consulta seja setado para o valor atual da linha do dataTable, ok!

Mas isso não acontece!!!

Já debuguei esse negócio 1000 vezes e eu descobri uma possível causa: a propriedade tratamento de tratamentoBean (de onde vem a minha lista de consultas) só é setada no fase UPDATE MODEL VALUES, mas parece que o método getConsultas() é chamado vários vezes durante a fase APPLY REQUEST VALUES.

Logo, pelo que entendi, não é passado para consultaBean a instância de Consulta que deveria ser passada porque ele não tem a propriedade tratamento de tratamentoBean em mãos para buscar as consultas, o só vai ocorrer em UPDATE MODEL VALUES!

O que vocês acham?

To há 5 horas mexendo nisso e não consigo resolver! Por favor, alguém ajuda!

Ola amigo

tive um problema semelhante e resolvi da seguinte forma

<p:column headerText="Ações"> <h:commandLink value="Excluir"> <f:setPropertyActionListener target=#{consultaBean.consulta} value="#{consulta}/> <f:actionListener binding="#{consultaBean.excluir()}" /> </h:commandLink> </p:column>

desse jeito ele chama o excluir apos o valor do objeto ser setado se não funcionar psote o metodo excluir e a datatable completa

Abraços

Não de certo.

Vou postar o código todo:

<p:dataTable value="#{tratamentoBean.tratamento.consultas}"
                         var="consulta"
                         styleClass="tb_list tb_list2"
                         id="listagemConsultas"
                         >
                <p:column headerText="Data">
                    <h:outputText value="#{consulta.inicio}">
                        <f:convertDateTime timeZone="America/Sao_Paulo" pattern="dd-MM-yyyy"/>
                        <em>(#{consulta.diaDaSemanaInicio})</em>
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Início">
                    <h:outputText value="#{consulta.inicio}">
                        <f:convertDateTime timeZone="America/Sao_Paulo" pattern="HH:mm"/>
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Término">
                    <h:outputText value="#{consulta.termino}">
                        <f:convertDateTime timeZone="America/Sao_Paulo" pattern="HH:mm"/>
                    </h:outputText>
                </p:column>
                
                <p:column headerText="Ações">
                    <sec:ifAnyGranted roles="ROLE_ADMINISTRADOR,ROLE_CONSULTAS_EXCLUSAO">
                        <h:commandLink action="#{consultaBean.excluir()}">
                            <h:graphicImage library="img" name="delete.png"/>
                            <f:setPropertyActionListener target="#{consultaBean.consulta}" value="#{consulta}"/>
                        </h:commandLink>
                        
                    </sec:ifAnyGranted>
                </p:column>
            </p:dataTable>
    public String excluir() {
        ConsultaRN cRN = new ConsultaRN();
        cRN.excluir(consulta);
        lista = null;

        return null;
    }

Ele não chega nem a chamar o excluir() de consultaBean.

To o domingo inteiro e nada!

Por favor. Preciso de ajuda!

tira o parenteses do excluir()

deixa assim:

<h:commandLink action="#{consultaBean.excluir}">  

Já fiz isso.

Amigo vc esta querendo excluir uma consulta de uma List ao que me parece, porém vc nao remove a consulta da lista quando o excluir é chamado tente do jeito abaixo

<h:commandLink action="#{consultaBean.excluir(consulta)}"> <h:graphicImage library="img" name="delete.png"/> </h:commandLink>

[code]

public String excluir(Consulta con) {

    listaConsulta.remove(con);    
    return null;  
} [/code]

Já tentei assim também, mas o excluir() não é nem chamado.

Para tentar avaliar onde poderia estar o problema eu criei em tratamentoBean um método chamado listarConsultasDoTratamento34() que retorna as consultas para esse tratamento.

Aí funcionou perfeitamente, tanto da maneira como você disse agora quanto da maneira como eu fiz no exemplo anterior.

O problema aqui é a dependência que existe da propriedade tratamento do managed bean TratamentoBean.

Eu percebi que tratamentoBean.tratamento.consultas é chamado várias vezes mas não entendo o porque o método excluir() se quer é chamado.

posta o codigo do managedBean ae

To pesquisando na web e cheguei a conclusão que a pergunta que devo fazer a vocês é:

Como faço para que os dados do p:dataTable venham de um método?

Por exemplo:

<p:dataTable value=#{meuBean.meuMetodo(outroBean.propriedade.id)}

O id que é passado como parâmetro está nulo sempre, por isso não funciona!

Não acho NENHUM exemplo na web que usa isso.

Vlw.

Eu estou tendo o mesmo problema que o teu com o datatable …
pelo que entendi o value do datatable só pode receber uma Lista e a partir que usamos o:

 <f:ajax render="@form"/>
 <f:setPropertyActionListener value="#{login}"  target="#{loginManagedBean.loginselecionado}" />

nós setamos o valor do action listener naquela posição em que está o CommandButton para o nosso atributo no ManagedBean
a partir daí podemos usar ele pra um confirmdialog ou um dialog usando esse atributo que criamos antes no MB

mesmo usando isso eu também estou com erro porem to passando o meu entendimento tentando aqui achar uma solução

Achei a solução:

<t:saveState/> do tomahawk!

usei assim:

<t:saveState value=#{tratamentoBean.tratamento}/>

<p:<p:dataTable value="#{consultaBean.listarConsultasPorTratamento(tratamentoBean.tratamento)}"> … </p:dataTable>

Agora o tratamento é corretamente carregado e a lista de consultas corretamente trazida do BD!

Vlw galera!