JSF + RichFaces + dataTable.getRowData = NoRowAvailableException

Meu problema é no método excluirContatoPresidente(); quando ele chama o getRowData.

Se alguém puder me ajudar ficarei eternamente grato.

Também estou usando o <a4j:keepAlive beanName=“faclube” />, não sei se isso pode interfeir em alguma coisa.

[code]public void excluirContatoPresidente()
{

    ContatoOnline elemento = (ContatoOnline) tabelaContatoPresidente.getRowData();
    listContatosOnlinePresidenteAdicionados.remove(elemento);
     
}[/code]
<rich:dataTable var="contato" value="#{faclube.listContatosOnlinePresidenteAdicionados}"
                                        onRowMouseOver="this.style.backgroundColor='#A8A8A8'"
                                        onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"
                                        binding="#{faclube.tabelaContatoPresidente}"
                                        width="100%">
                            <rich:column sortBy="#{contato.tipo}" >
                                <f:facet name="header">
                                    Tipo
                                </f:facet>
                                <h:outputText value="#{contato.tipo}" /> 
                            </rich:column>
                            <rich:column sortBy="#{contato.nome}" >
                                <f:facet name="header">
                                    Nome
                                </f:facet>
                                <h:outputText value="#{contato.nome}" />
                            </rich:column>
                            <rich:column style="text-align:center;">
                                <f:facet name="header">
                                    Excluir
                                </f:facet>
                                <a4j:commandLink action="#{faclube.excluirContatoPresidente}">
                                    <h:graphicImage value="../imagens/icones/delete.gif" style="cursor:pointer" />
                                </a4j:commandLink>
                            </rich:column>
                        </rich:dataTable>

E está me gerando a seguinte exceção:

javax.faces.model.NoRowAvailableException
	javax.faces.model.ListDataModel.getRowData(ListDataModel.java:150)
	org.ajax4jsf.model.SequenceDataModel.getRowData(SequenceDataModel.java:147)
	org.ajax4jsf.component.UIDataAdaptor.getRowData(UIDataAdaptor.java:257)
	officeMusic.action.FaclubeBean.excluirContatoPresidente(FaclubeBean.java:98)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	org.apache.myfaces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:57)
	javax.faces.component.UICommand.broadcast(UICommand.java:387)
	org.ajax4jsf.component.AjaxActionComponent.broadcast(AjaxActionComponent.java:55)
	org.ajax4jsf.component.UIDataAdaptor.broadcast(UIDataAdaptor.java:1383)
	org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
	org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
	org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
	org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
	org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
	org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
	org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)

o que retorna nesse método faclube.listContatosOnlinePresidenteAdicionados ?
coloca ele ai?

Retorna uma lista de objetos da classe ContatoOnline.

Estou no trabalho e esse projeto eu estou fazendo em casa, mas acho que tudo que é realmente relevante eu já coloquei no post.

Esse você já usou esse getRowData no HtmlDataTable?? Rodou legal??? Não faço idéia do pq não está funcionando.

ja usei…roda susse…

mas é o seguinte… esse método faclube.listContatosOnlinePresidenteAdicionados não pode retornar uma lista né… tem que retornar um DataModel…manja??
por ex:

private DataModel tabela;
get e set
...
//esse método que vc chama no seu dataTable
public DataModel getConsultaTodos()
	{
		try
		{
			return tabela = new ListDataModel(agenciaDao.findAll()) ;
		} 
		catch (Exception e)
		{
			super.tratarExcecao(e, "getConsultaTodos");
			return new ListDataModel();
		}
	}

No value dele eu passo o DataModel???

Pensei que com o binding e chamando a ação dentro dele já seria o suficiente para eu conseguir usar o getRowData();

o objeto tabelaContatoPresidente nesse caso é um HtmlDataTable…

Tem como vc me mostrar mais desse seu código para eu dar uma olhada???

Se pude me mostrar como fica a tag da tabela tb ficaria grato.

isso passa o dataModel…igual no exemplo q mostrei antes… o método getConsultaTodos…
nem precisa usar o biding…

<rich:dataTable var="contato" value="#{bean.consultaTodos}"   
                                        onRowMouseOver="this.style.backgroundColor='#A8A8A8'"   
                                        onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'"                                           
                                        width="100%">  
...
</rich:dataTable>

consultaTodos é o exemplo q te passei antes…

O DataModel possui o método getRowData()???

Assim que chegar em casa eu vou testar desse jeito.

tem sim

/** * Obtem a agencia que foi selecionada na tabela de consulta * @return */ public Agencia getAgenciaTabela() { return (Agencia) tabela.getRowData(); }

Funcionou.

Mas não sei pq estava dando errado usando o binding do HtmlDataList.

Valeu mesmo!!!

Pessoal aproveitando o topic to tomando a merma exception.

Seguinte, tenho um datatable que preciso que ao clicar numa linha, ele redirecione pra outro xhtml com 2 formularios de objetos povoados pra eu poder editar ( eh nessa hora q tomo o norowavaibleexception ) .

O outro “bug” que ocorre é o seguinte, quando eu clico no informaçoes do responsavel pra abrir o dialog, ele abre vazio, só apos eu selecionar uma linha e apertar f5 eh que ele provavelmente ta selecionando… acho q deu pra entender ± oq ta acontecendo… ai vão os codigos


<p:dataTable var="solicitacao" value="#{solicitanteBean.listaSolicitacoes}" 
                             selection="#{solicitanteBean.solicitacaoSelecionada}"
                             selectionMode="single">
                    <f:facet name="header">
                        Selecione uma solicitação e depois clique na ação desejada
                    </f:facet>

                    <p:column selectionMode="single" />
                    <p:column>
                        <f:facet name="header">
                            Data Solicitada
                        </f:facet>
                        <h:outputText value="#{solicitacao.datasolicitada}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Motivo
                        </f:facet>
                        <h:outputText value="#{solicitacao.motivo}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Espaço Restrito
                        </f:facet>
                        <h:outputText value="#{solicitacao.espacorestrito}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Endereço
                        </f:facet>
                        <h:outputText value="#{solicitacao.solicitante.endereco}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Responsável
                        </f:facet>
                        <h:outputText value="#{solicitacao.usuario.nome}" />
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Situação
                        </f:facet>
                        <h:outputText value="#{solicitacao.status}" />
                    </p:column>

                    <f:facet name="footer">
                        <p:commandButton value="Informações do Responsável" image="ui-icon ui-icon-search"
                                         update="form:display" oncomplete="solicitacaoDialog.show()"/>
                        <p:commandButton value="Editar" image="ui-icon ui-icon-wrench"
                                         action="#{solicitanteBean.editarSolicitacao}" ajax="false"  />
                        <p:commandButton value="Remover" image="ui-icon ui-icon-trash"
                                         update="form:display" oncomplete="carDialog.show()"/>
                    </f:facet>
                </p:dataTable>
                <p:dialog header="Informações do Responsável" widgetVar="solicitacaoDialog" resizable="false"
                          width="500"  showEffect="clip" hideEffect="fold">
                    <h:panelGrid id="display" columns="2" cellpadding="4">

                        <h:outputText value="Nome:" />
                        <h:outputText value="#{solicitanteBean.solicitacaoSelecionada.usuario.nome}" />
                        <h:outputText value="Matrícula" />
                        <h:outputText value="#{solicitanteBean.solicitacaoSelecionada.usuario.matricula}" />
                    </h:panelGrid>
                </p:dialog>

e o bean:

@Named(value = "solicitanteBean")
@SessionScoped
public class SolicitanteBean implements Serializable {

    @EJB
    private SolicitanteDAO solicitanteDAO;
    @EJB
    private SolicitacaoDAO solicitacaoDAO;
    private Solicitante solicitante = new Solicitante();
    private Solicitacao solicitacao = new Solicitacao();
    private List<Solicitante> solicitantes;
    private List<Solicitacao> solicitacoes;
    public DataModel listaSolicitacoes;
    private Solicitacao solicitacaoSelecionada;

    public DataModel getListaSolicitacoes() {
        List<Solicitacao> listaSolicitacao = new ArrayList<Solicitacao>();
        listaSolicitacao.addAll(solicitacaoDAO.listar());
        listaSolicitacoes = new ListDataModel(listaSolicitacao);
        return listaSolicitacoes;
    }

    public void setListaSolicitacoes(DataModel listaSolicitacoes) {
        this.listaSolicitacoes = listaSolicitacoes;
    }

    // Construtor vazio
    public SolicitanteBean() {
    }

    public void novo() {
        solicitante = new Solicitante();
        solicitacao = new Solicitacao();
    }

    

    /**
     * Método que recupera o objeto selecionado na tabela de consulta e redireciona para a tela de editar.
     */
    public String editarSolicitacao() {

        Solicitacao selectsolicitacao = (Solicitacao) listaSolicitacoes.getRowData();
        this.solicitacao = selectsolicitacao;
        this.solicitante = selectsolicitacao.getSolicitante();
        System.out.println("editarsolicitacao");
        return "solicitante";

    }
//gets e sets

desde já agradeço mto!