Ajuda com binding UIData

15 respostas
kelvis

pessoALL,

Tô tentando usar o componente UIData do jsf para recuperar dados do meu dataTable e altera, mas tá dando erro quando faço o binding do mesmo no meu dataTable…
O Escopo do seam que tô usando é PAGE e meu controle está anotado com @Name(“contatoControle”)…

erro

/paginas/evento/dadosindividuais/contato/cadastrar.xhtml @70,96 binding="": Target Unreachable, identifier ‘contatoControle’ resolved to null

no meu controle faço

private UIData itemDataTable;

//gets e sets do UIData
public UIData getItemDataTable() {
		return itemDataTable;
	}

	public void setItemDataTable(UIData itemDataTable) {
		this.itemDataTable = itemDataTable;
	}

        //recupera a linha do dataTable
        public String alterarStatusParaAlterado(EventoContato contato){
			 contato = (EventoContato)itemDataTable.getRowData();
			 return null;
	}

xhtml onde faço binding

<rich:dataTable id="tbContato" width="450px" border="0" cellpadding="0" var="c"
										value="#{contatoControle.contatosPessoa}" binding="#{contatoControle.itemDataTable}">
										
										<f:facet name="header">
											<rich:columnGroup>
												<h:column>
													<h:outputText value="Tipo Contato"></h:outputText>
												</h:column>
												<h:column>
													<h:outputText value="Contato"></h:outputText>
												</h:column>
												<h:column>
													<h:outputText value="Excluir"></h:outputText>
												</h:column>
												<h:column>
													<h:outputText value="Editar"></h:outputText>
												</h:column>
											</rich:columnGroup>
										</f:facet>
										<h:column>
											<h:outputText value="#{c.tipoContato.descricao}" />
										</h:column>
										<h:column>
											<h:outputText value="#{c.valor}"></h:outputText>
										</h:column>
										<h:column>
											<a4j:commandButton value="Excluir"
														   	   action="#{contatoControle.alterarStatusParaExcluido(c)}"
												               reRender="tbContato" />
										</h:column>
										<h:column>
											<a4j:commandButton value="Alterar" action="contatoControle.alterarStatusParaAlterado"/>
										</h:column>
	
									</rich:dataTable>

espero que alguém possa ajudar

15 Respostas

R

ja tentasse o escopo session?
Uso aqui normal , porem com o escopo session, tenta ai.

R

mostra seu bean, ele esta falando que seu beam esta null

dev.rafael

Bindings são desaconselhaveis. Já tenteou fazer sem o binding?

R

bom não acho que seja desaconselhavel não , pois , para fazer “true pagination” fica até mais fácil em fazer com biding e podendo ustar os proprios componentes do richfaces

kelvis

Se eu não usar O binding tenho que usar o value e o value já está sendo utilizado para carregar o dataTable com uma lista…
Eu uso esse UIData dessa mesma forma em outro projeto mas que não usa o jBOss seam e funciona perfeitamente…
Eu li bastante sobre esse erro e falam muito sobre o ESCOPO…

kelvis

//Esse é meu Bean, mas o erro tá dizendo que meu controle que tá null

@Entity
@Table(name="CONTATO", schema="RH_QUADRO")
@PrimaryKeyJoinColumn(name="EVENTO_ID")
public class EventoContato extends Evento implements Serializable {
	
	@Column(name="VALOR", length= 100)
	private String valor;
	
	@Column(name="COMPLEMENTO", length= 50)
	private String complemento;
		
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "PESSOA_ID", nullable = false)
	private Pessoa pessoa;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name = "TIPO_CONTATO_ID", nullable = false)
	private TipoContato tipoContato;

	
	public String getValor() {
		return valor;
	}
	public void setValor(String valor) {
		this.valor = valor;
	}
	public String getComplemento() {
		return complemento;
	}
	public void setComplemento(String complemento) {
		this.complemento = complemento;
	}
	public Pessoa getPessoa() {
		return pessoa;
	}
	public void setPessoa(Pessoa pessoa) {
		this.pessoa = pessoa;
	}
	public TipoContato getTipoContato() {
		return tipoContato;
	}
	public void setTipoContato(TipoContato tipoContato) {
		this.tipoContato = tipoContato;
	}
	
}
kelvis

rjbcordeiro:
ja tentasse o escopo session?
Uso aqui normal , porem com o escopo session, tenta ai.

Não posso usar scopo de Session nesse projeto… regra da arquitetura

dev.rafael

De fato binding de componentes é uma coisa q, felizmente, tende a desaparecer do JSF. True pagination pode ser fácilmente implementada com apenas um List por mais incrível q isso possa parecer, e um exemplo disso é mostrado no livro Real World JEE patterns do Adam Bien.

R

sim pow, mostra ai o ‘contatoControle’, tem que ver como vc esta montando a tabela

R

Mas olha, se vc for “bindar” , no value vc tem que ter um DataModel e não uma Lista ok.

dev.rafael

kelvis vc pode usar o value p/ carregar os dados do dataTable e ainda ñ precisaria de um binding p/ obter o campo quando o botao/link excluir for clicado.

<rich:dataTable id="tbContato" width="450px" border="0" cellpadding="0" var="c"  value="#{contatoControle.contatosPessoa}">  
  <h:column>  
    <a4j:commandButton value="Excluir"  action="#{contatoControle.alterarStatusParaExcluido}"   reRender="tbContato">  
      <f:setPropertyActionListener target="#{contadoControle.eventoContato}" value="#{c}" />
    </a4j:commandButton>
  </h:column>  
</rich:dataTable>

E no ManagedBean:

public EventoContato getEventoContato() { return ec; }
public void setEventoContado(EventoContato ec) { this.ec = ec; }

public String alterarStatusParaAlterado() {
  // seu código vai aqui...
}
R

bom vc pode usar <f:setPropertyActionListener target="#{contadoControle.eventoContato}" value="#{c}" /> com o binding para pegar o objeto contato, no caso para vc fazer uma tabela não pode se esquecer da paginação e como no richfaces já tem o componente pronto, vc pode utiliza-lo, de forma que pese menos para o servidor

então cria o datamodel, faz um binding e utiliza o componente de paginação do proprio richfaces para não reinventar a roda.

kelvis

Ok galera… vou adaptar aqui e ver o que consigo fazer usando <f:setPropertyActionListener target="#{contadoControle.eventoContato}" value="#{c}" />

A princípio resolvi meu problema fazendo isso ao invés de usar o UIData:

public void alterarStatusParaAlterado(EventoContato contato){
   //eventoContato é a instância do meu Objeto EventoContato
   this.eventoContato = contato;
}

Daí quando clico no meu a4:j commandButton e chamo o método mando dar um reRender no meu panelGrid e ele recupera os dados mostrando o valor dentro do devido campo para alteração…

depois posto o código aqui…

kelvis

Esse é o método

public void alterarStatusParaAlterado(EventoContato contato){  
       //eventoContato é a instância do meu Objeto EventoContato  
       this.eventoContato = contato;  
    }

Esse é o button no xhtml

<a4j:commandButton value="Alterar" action="#{contatoControle.alterarStatusParaExcluido(c)}" reRender="gridContato"/>

funciona uma blz…

kelvis

Eu queria mesmo descobrir porque o UIData num funciona… Se um dia eu descobrir, posto aqui…

=D

Criado 25 de outubro de 2010
Ultima resposta 26 de out. de 2010
Respostas 15
Participantes 3