Skiron
Maio 27, 2013, 4:09pm
#1
Eu tenho um selectOneMenu dentro de uma tabela com rowEditing no primefaces, e o rowEditing está alterando normalmente os outros dados como nome etc. Mas quando chega na hora de escolher uma cidade com o selectOneMenu, ele simplesmente ignora minha alteração, e continua com a anterior…
Eu vi em certos casos que necessita de um converter, mas quando não uso o rowEditing para alterar, funciona normalmente, então acho que não deve ser necessário um converter
<p:column headerText="Cidade" style="width:20%">
<p:cellEditor>
<f:facet name="output">
<h:outputText value="#{item.cidade.nomeCidade}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu id="cidade" value="#{clienteControle.idCidade}">
<f:selectItems value="#{cidadeControle.lista}"
var="itens"
itemLabel="#{itens.nomeCidade}"
itemValue="#{itens.idCid}" />
</h:selectOneMenu>
</f:facet>
</p:cellEditor>
</p:column>
e este é o metodo que eu chamo quando clico para alterar:
public void onEdit(RowEditEvent event) {
Object itemAlterado = event.getObject();
em.getTransaction().begin();
em.merge(itemAlterado);
em.getTransaction().commit();
FacesMessage msg = new FacesMessage("Cliente editado");
FacesContext.getCurrentInstance().addMessage(null, msg);
}
Alguma ideia do que está errado? É realmente necessário um converter?
Se este trecho:
for assim:
<h:selectOneMenu id="cidade" value="#{clienteControle.cidade}">
precisa de converter
e se for assim:
não precisa de converter
Skiron
Maio 27, 2013, 7:56pm
#3
Do jeito que eu coloquei ele grava os outros dados, mas ignora o selectOneMenu, do jeito que voce colocou em que não precisa de converter, ele não grava nada pois não da para clicar no botão de salvar…
Hoje eu pude olhar melhor o seu post.
Tem uma coisa errada aí. Como vc está dentro de uma datatable com cell-editing, este trecho
<f:facet name="output">
<h:outputText value="#{item.cidade.nomeCidade}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu id="cidade" value="#{clienteControle.idCidade}">
<f:selectItems value="#{cidadeControle.lista}"
var="itens"
itemLabel="#{itens.nomeCidade}"
itemValue="#{itens.idCid}" />
</h:selectOneMenu>
</f:facet>
precisa ser assim,
<f:facet name="output">
<h:outputText value="#{item.cidade.nomeCidade}" />
</f:facet>
<f:facet name="input">
<h:selectOneMenu id="cidade" value="#{item.cidade}">
<f:selectItems value="#{cidadeControle.lista}"
var="itens"
itemLabel="#{itens.nomeCidade}"
itemValue="#{itens}" />
</h:selectOneMenu>
</f:facet>
Skiron
Maio 28, 2013, 2:33pm
#5
Eu tentei do jeito que você falou e dá erro de converter
Então eu coloco o converter e dá este erro:
Este foi o converter que eu coloquei:
public class CidadeConverter implements Serializable, Converter{
@Override
public Cidade getAsObject(FacesContext fc, UIComponent uic, String string) {
if (string == null){
return null;
}
return GeraEntityManager.getInstance().getEntityManager().find(Cidade.class,
Integer.parseInt(string));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object o) {
if (o == null){
return null;
}
Cidade obj = (Cidade) o;
return obj.getIdCid().toString();
}
}
Debuga esse teu converter, ve se está chegando um ID na string;
e se está chegando uma cidade no Object o;
Outra coisa
Cidade e companhia estão implementando equals e hashcode pelo ID?
Skiron
Maio 28, 2013, 2:50pm
#7
Era exatamente o equals e o hashcode, implementei eles e funcionou!
obrigado pelo toque… vlw!