SelectOneMenu - Converter retorna o valor Nulo

207 views
Skip to first unread message

Robson

unread,
Jun 28, 2016, 8:35:57 PM6/28/16
to javasf: JavaServer Faces Group
Prezados boa noite.

Sei que este "problema" é recursivo, batido e debatido tema ai nos blogs mais mesmo com tudo isto, mesmo com todo equals e hashCode e converter ele insiste e persiste e como muitos eu de igual forma tô a horas testando, vendo, lendo..... e realmente chega uma hora que nos damos por vencidos, pois tô eu agora recorrendo aqui o grupo  

Se os senhores puderem me ajudar, na verdade nem tem muito o que dizer de tão simples, uma tela de cadastro de Municipios três campos apenas

Projeto com JSF 2.2 + CDI + Hibernate
Tomcat 8
PostgreSQL

O comportamento é o seguinte: nenhum erro apenas não salva no banco e na classe que é um converter da entidade estado eu coloquei para printar os valores e o que ocorre é que quando gravamos ( ou melhor ) quando o evento de gravar é chamado no log do eclipse o que eu notei foi o seguinte digamos que o estado escolhido foi o de código AM

getAsObject - O valor é: AM
getAsObject - O valor é Nulo
getAsObject - O valor é Nulo
getAsObject - O valor é Nulo

Ou seja o log acusa que o converter foi acionado quatro vezes mais apenas a primeira ele tem um valor


Classes de Entidades - get e set omitidos
Estado.java
@Entity
@Table(name = "estado")
public class Estado implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@Column(name="id_estado")
private String idEstado;

@Column(name="ds_estado")
private String dsEstado;

//bi-directional many-to-one association to Municipio
//@OneToMany(mappedBy="estado")
//private List<Municipio> municipios;
//bi-directional many-to-one association to Municipio
//@OneToMany(mappedBy="estado")
//private List<Contato> contatos;

        public Estado() {
        }

   @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((dsEstado == null) ? 0 : dsEstado.hashCode());
result = prime * result
+ ((idEstado == null) ? 0 : idEstado.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Estado other = (Estado) obj;
if (dsEstado == null) {
if (other.dsEstado != null)
return false;
} else if (!dsEstado.equals(other.dsEstado))
return false;
if (idEstado == null) {
if (other.idEstado != null)
return false;
} else if (!idEstado.equals(other.idEstado))
return false;
return true;
}

@Override
        public String toString() {
        return dsEstado;
    }
    
    
    
}


Municipio.java
@Entity
@Table(name = "municipio")
public class Municipio implements Serializable {
private static final long serialVersionUID = 1L;

@Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)    
@Column(name="id_municipio")
private Integer idMunicipio;

@NotEmpty
@Column(name="ds_municipio")
private String dsMunicipio;

@NotEmpty
@Column(name="cod_ibge")
private String codIbge;
//bi-directional many-to-one association to Estado
//@ManyToOne(fetch=FetchType.LAZY)
//@JoinColumn(name="id_estado")
@ManyToOne
@JoinColumn(name="id_estado")
private Estado estado;
//bi-directional many-to-one association to Municipio
@OneToMany(mappedBy="municipio")
private List<Contato> contatos;

        public Municipio() {
        }


@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((codIbge == null) ? 0 : codIbge.hashCode());
result = prime * result
+ ((dsMunicipio == null) ? 0 : dsMunicipio.hashCode());
result = prime * result
+ ((idMunicipio == null) ? 0 : idMunicipio.hashCode());
return result;
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Municipio other = (Municipio) obj;
if (codIbge == null) {
if (other.codIbge != null)
return false;
} else if (!codIbge.equals(other.codIbge))
return false;
if (dsMunicipio == null) {
if (other.dsMunicipio != null)
return false;
} else if (!dsMunicipio.equals(other.dsMunicipio))
return false;
if (idMunicipio == null) {
if (other.idMunicipio != null)
return false;
} else if (!idMunicipio.equals(other.idMunicipio))
return false;
return true;
}

@Override
    public String toString() {
        return dsMunicipio;
    }
        
}


Converter
@FacesConverter("estadoConverter")
public class EstadoConverter implements Converter {
 
@Override
        public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {
System.out.println("getAsObject - O valor é: " + value);
        if (value != null && !value.isEmpty()) {
        System.out.println("Ok - getAsObject - Valor: "+ value);
            return (Estado) uiComponent.getAttributes().get(value);
        } else {
    System.out.println("getAsObject - O valor é Nulo");        
        }
        return null;
    }

    @Override
    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object value) {
   
    if (value == null) {
   return null;
}    
   
        if (value instanceof Estado) {
            Estado entidade = (Estado) value;

            System.out.println("getAsString - Valor: " + entidade.getIdEstado().toString() );

            if (entidade != null && entidade instanceof Estado && entidade.getIdEstado() != null) {
                uiComponent.getAttributes().put( entidade.getIdEstado().toString(), entidade);
                return entidade.getIdEstado().toString();
            }
        }
        return "";
    }
}


O controller aqui esta usando o ViewScoped do pacote javax.faces.view.ViewScoped

MunicipioController.java
@Named(value = "municipioC")
@ViewScoped
public class MunicipioController extends AbstractMB {

private List<Municipio> elementos;
private Municipio registroSelecionado;
private Municipio municipio;
private Estado estado;
private SelectItem[] estados;

@Inject
private MunicipioService municipioService;

@Inject
private EstadoService estadoService;

public MunicipioController() {
}

public void salvar() {
try {

    municipioService.update(municipio);
    closeDialog();
    displayInfoMessageToUser("Registro criado com sucesso!");
    load();
    preparaInclusao();

} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ocorreu um erro ao atualizar o registro. "
+ e.getMessage());
e.printStackTrace();
}
}
public void excluir() {
try {
this.municipioService.delete(municipio);
closeDialog();
displayInfoMessageToUser("Registro excluido com sucesso!");
load();
preparaInclusao();
} catch (Exception e) {
keepDialogOpen();
displayErrorMessageToUser("Ocorreu um erro ao tentar excluir o registro. "
+ e.getMessage());
e.printStackTrace();
}
}

public void selectRegistro(SelectEvent evt) {
try {
if (evt.getObject() != null) {
this.registroSelecionado = (Municipio) evt.getObject();
} else {
this.registroSelecionado = null;
}
} catch (Exception e) {
this.registroSelecionado = null;
}
}

public List<Municipio> getElementos() {
if (elementos == null) {
load();
}

return elementos;
}

private void load() {
elementos = municipioService.findAll();
}

public void preparaInclusao() {
this.municipio = new Municipio();
this.estado = new Estado();
}
public void preparaAlteracao() {
this.municipio = getRegistroSelecionado();
}

public void unselect() {
this.registroSelecionado = null;
}

public Municipio getMunicipio() {

if (municipio == null) {
municipio = new Municipio();
}

return municipio;
}

public Municipio getRegistroSelecionado() {
if (registroSelecionado == null) {
registroSelecionado = new Municipio();
}

return registroSelecionado;
}
public void setRegistroSelecionado(Municipio registroSelecionado) {
this.registroSelecionado = registroSelecionado;
}
public Estado getEstado() {
return estado;
}

public void setEstado(Estado estado) {
this.estado = estado;
}

public SelectItem[] getEstados() {
if (estados == null) {
    estados = FacesUtil.getSelectItems(estadoService.findAll(), true);
}
return estados;

}

@FacesConverter(forClass = Municipio.class)
public static class MunicipioControllerConverter implements Converter {

public Object getAsObject(FacesContext facesContext, UIComponent component, String value) {
           if (value != null) {  
                return this.getAttributesFrom(component).get(value);  
            }
           
            return null; 
        }

java.lang.Integer getKey(String value) {
java.lang.Integer key;
key = Integer.valueOf(value);
return key;
}

String getStringKey(java.lang.Integer value) {
StringBuffer sb = new StringBuffer();
sb.append(value);
return sb.toString();
}

public String getAsString(FacesContext facesContext, UIComponent component, Object object) {
if (object == null) {
            return null;
}
if (object instanceof Municipio) {
     Municipio o = (Municipio) object;
      return getStringKey(o.getIdMunicipio());
} else {
throw new IllegalArgumentException("object " + object
+ " is of type " + object.getClass().getName()
+ "; expected type: "
+ MunicipioController.class.getName());
}
}
       protected Map<String, Object> getAttributesFrom(UIComponent component) {  
           return component.getAttributes();  
       }          

}

}



e por fim o xhtml 
<ui:define name="content">
<h1 class="aw-page-title">Municípios</h1>

<h:form id="frm">

<p:toolbar>
<p:toolbarGroup>
<p:commandButton id="btnAdd" title="Novo registro"
action="#{municipioC.preparaInclusao}"
oncomplete="PF('itemDialog').show()" process="@this"
update="itemPanel" icon="fa fa-fw fa-plus" />
<p:commandButton id="btnEdi" title="Edita registro"
action="#{municipioC.preparaAlteracao}"
oncomplete="PF('itemDialog').show()" process="@this"
update="itemPanel" icon="fa fa-fw fa-edit" />
</p:toolbarGroup>
</p:toolbar>

<p:messages autoUpdate="false" />

<p:dataTable id="itensTable" widgetVar="dataTable" var="item"
loadingMessage="Carregando..." emptyMessage="Nenhum registro."
reflow="true" value="#{municipioC.elementos}" selectionMode="single"
selection="#{municipioC.registroSelecionado}"
rowKey="#{item.idMunicipio}" style="margin-top:10px">

<p:ajax event="rowSelect" listener="#{municipioC.selectRegistro}" />

<p:column headerText="Id" style="width:50px">
<h:outputText value="#{item.idMunicipio}" />
</p:column>

<p:column headerText="Municipio">
<h:outputText value="#{item.dsMunicipio}" />
</p:column>

<p:column headerText="Uf">
<h:outputText value="#{item.estado.idEstado}" />
</p:column>

</p:dataTable>

<p:dialog widgetVar="itemDialog" header="Gerencia municipios"
responsive="true" resizable="false" showEffect="explode"
hideEffect="bounce" style="min-width: 400px" modal="true">

<p:toolbar>
<p:toolbarGroup>
<p:commandButton icon="fa fa-fw fa-save" title="Salvar"
action="#{municipioC.salvar}" process="itemPanel"
update="itemPanel itensTable"
oncomplete="closeDialogIfSucess(xhr, status, args, PF('itemDialog'), 'itemDialog')" />
</p:toolbarGroup>
</p:toolbar>

<h:panelGroup id="itemPanel" layout="block" styleClass="ui-fluid" style="margin-top:10px;">
<p:messages id="msgDialog" autoUpdate="false" />

<p:panelGrid columns="2" layout="grid"
styleClass="panelgrid-noborder"
columnClasses="ui-grid-col-4, ui-grid-col-8">

<p:outputLabel for="nome" value="Municipio:" />
<p:inputText id="nome" value="#{municipioC.municipio.dsMunicipio}"
placeholder="Municipio" size="50" />
<p:outputLabel for="ibge" value="Codigo IBGE:" />
<p:inputText id="ibge" value="#{municipioC.municipio.codIbge}"
placeholder="Codigo IBGE" size="10" />

<p:outputLabel for="estado" value="Estado" />
<p:selectOneMenu id="estado"
value="#{municipioC.municipio.estado}" converter="estadoConverter">
<f:selectItems value="#{municipioC.estados}" var="itemE"
itemValue="#{itemE}" itemLabel="#{itemE.dsEstado}" />
</p:selectOneMenu>

</p:panelGrid>

</h:panelGroup>

</p:dialog>

</h:form>



Bem agora só tenho a agradecer até antecipadamente qualquer comentário e desculpas adiantadas porque este problema é mais um do mesmo, mais até parece rotina de quem esta com o problema dizer que já tentou de tudo.


  

- Davi M .

unread,
Jun 28, 2016, 11:27:39 PM6/28/16
to jav...@googlegroups.com
Tem como postar o bean e o campo do selectOneMenu?

De: Robson
Enviada em: ‎28/‎06/‎2016 21:36
Para: javasf: JavaServer Faces Group
Assunto: [javasf] SelectOneMenu - Converter retorna o valor Nulo

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/javasf/544b6e53-9006-48cb-a11d-851adc20ff57%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Robson

unread,
Jun 29, 2016, 7:17:06 AM6/29/16
to javasf: JavaServer Faces Group
Olá bom dia.

Davi meu caro tudo bem? então o que vc perguntou esta tudo ai no que eu postei, só não coloquei o Dao, e a Classe de Serviço

Davi Mustafa

unread,
Jun 29, 2016, 8:43:48 AM6/29/16
to javasf: JavaServer Faces Group
Opa Robson, bom dia. Foi mal, tinha lido do celular e não vi tudo.

Cara, quando tu debugou, os valores no converter aparecem direitinho antes de ir pra tela? Quando tu carrega o getEstados(), ta vindo os valores do jeito que tu quer tambem? O problema ta só mesmo no salvar?

Em 29 de junho de 2016 08:17, Robson <robson...@hotmail.com> escreveu:
Olá bom dia.

Davi meu caro tudo bem? então o que vc perguntou esta tudo ai no que eu postei, só não coloquei o Dao, e a Classe de Serviço

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Rafael Ponte

unread,
Jun 29, 2016, 8:49:41 AM6/29/16
to javasf: JavaServer Faces Group
Olá,

Seu código parece estar correto, exceto pelo ponto que você está retornando uma array de SelectItem em vez da List de Estado's. Esse parece ser o problema. Faça a mudança e veja se agora funciona!

Enfim, a idéia que você não use os componentes do JSF diretamente nos seus managed beans, mas sim favoreça o não uso deles. 

Um abraço,


Para mais opções, acesse https://groups.google.com/d/optout.
--
Rafael Ponte
TriadWorks | Formação Java
http://cursos.triadworks.com.br

Robson

unread,
Jun 29, 2016, 9:01:41 AM6/29/16
to javasf: JavaServer Faces Group
Olá!


Davi, Rafael vou usar o List e posto o resultado, posto mesmo.

Robson

unread,
Jun 29, 2016, 9:26:22 AM6/29/16
to javasf: JavaServer Faces Group
Não, continua o mesmo problema ou seja "não dá erro algum" mais também não insere nada na tela de Municipios, agora se eu mudar o scopo para Session Ok funciona mais não tem que ser este
o que estou usando é ViewScoped.

Será que tem a ver com o mapeamento nas classes de entidade?

em Estado.java tenho

//bi-directional many-to-one association to Municipio
@OneToMany(mappedBy="estado")
private List<Municipio> municipios;

em Municipio.java tenho 
//bi-directional many-to-one association to Estado
@ManyToOne(fetch=FetchType.LAZY)

Rafael Ponte

unread,
Jun 29, 2016, 9:41:43 AM6/29/16
to javasf: JavaServer Faces Group
Oi Robson,

Imaginei que não fosse problema de escopo pois você estava usando @ViewScoped. Mas agora que você disse que funciona com @SessionScoped então o problema pode estar realmente relacionado ao escopo.

Faça-me um favor, coloque no construtor default do managed bean (com @ViewScoped) um System.out.println() para ver se este managed bean é criado mais de uma vez. Ele deve ser criado apenas na 1a vez que você entrar na página, enquanto você não mudar de página ele funcionará como se estivesse na sessão, ou seja, qualquer requisição AJAX usurá o mesmo managed bean.

Faça o teste, por favor.


--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.

Robson

unread,
Jun 29, 2016, 12:02:50 PM6/29/16
to javasf: JavaServer Faces Group
Olá Rafael boa tarde.

Então, fiz o teste e só tem uma unica ocorrência, e estou usando @viewScoped.

Bem o que eu fiz, minha tela tem uma Grade ( p:dataTable ), e com um botão eu chamo um dialogo ( p:dialog ) etc... etc..., então eu dupliquei a tela e tirei tudo isto, ficando apenas os inputs e o selectOneMenu e o Salvar, e desta forma não tem problema, o registro é salvo com sucesso ( isto quer dizer que não tem nada errado )

Já chamo a tela duplicada, e ela não cadastra nada, mais chega a dar um erro sim aquele erro de validação "O valor não é valido"  refererindo-se ao SelectOneMenu ( vai a tela em anexo com a mensagem) eu mudo o estado, escolho outro qualquer clico em Salvar.  A tela ( dialogo ) desaparece ( como é o programado quando o registro for salvo ), só que Nada foi salvo e sem mensagem de erro alguma e nada ocorre mesmo com o Try na classe controller ( MB ).

cara uma tela que nem tem o que fazer se fizesse em MS-VFP ou até java desktop, Delphi etc...é 1 minuto para estar pronta com classes e etc... ( desculpem o desabafo mais é que eu me volto para um projeto a fim de aprender JSF e passar dois dias com algo que nem processa, imagina quando chegar em um processamento pesado )
Tela do erro.jpg

Rafael Ponte

unread,
Jun 29, 2016, 12:21:50 PM6/29/16
to javasf: JavaServer Faces Group
Opa,

Toda tecnologia tende a ser simples quando você domina ou quando precisa apenas fazer CRUDs. Não se frustre com as dificuldades, não ainda!

Não entendi bem sua explicação, ficou confusa, ao menos para mim. Mas faça o seguinte, no p:commandButton do p:dialog, ajuste o atributo process para "@this itemPanel".

(embora não pareça ser o problema, eu diria que os métodos equals() e hashCode() das tuas entidades não estão muito legais. tem certeza que TODOS os atributos das entidades funcionam como IDentidade?)

Um abraço,

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.

Davi Mustafa

unread,
Jun 29, 2016, 12:30:15 PM6/29/16
to javasf: JavaServer Faces Group
Oi Robson, 

Tem certeza que ta passando pelo método salvar? Tu falou que não caiu no try catch nem nada. Ve se ele realmente ta chamando o salvar.

Abraço


Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Message has been deleted

Robson

unread,
Jun 29, 2016, 2:37:24 PM6/29/16
to javasf: JavaServer Faces Group
Ola

OIá Rafael boa tarde.

é meu tem hora que a gente sai do serio e é verdade eu não tenho tantas horas assim em Java Web mais é isto que eu estou tentando, só que quando diante de uma coisa tão simples a coisa num anda, e sabendo que tá funcionando só que algo que tem a mais ....na tela que tem um dialogo, mais vamos lá são só dois dias até aqui.

Então o botão dentro do dialogo tem o seguinte update="itemPanel itensTable" se eu colocar @this e itemPanel a Tabela não será atualizada, já o @this eu penso nele apenas no process parara não processar o formulario todo mais, vamos ver isto
 
sobre a "identidade" olha eu tinha todos os atributos da entidade la no equals e hashCode mais tirei deixei apenas o Id






Rafael Ponte

unread,
Jun 29, 2016, 2:45:25 PM6/29/16
to javasf: JavaServer Faces Group
Oi,

Eu estava falando desse botão aqui:
<p:toolbar>
<p:toolbarGroup>
<p:commandButton icon="fa fa-fw fa-save" title="Salvar"
action="#{municipioC.salvar}" process="@this itemPanel"
update="itemPanel itensTable"
oncomplete="closeDialogIfSucess(xhr, status, args, PF('itemDialog'), 'itemDialog')" />
</p:toolbarGroup>
</p:toolbar>

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.

Robson

unread,
Jun 29, 2016, 2:52:33 PM6/29/16
to javasf: JavaServer Faces Group
Olá boa tarde.

Prezados antes de tudo obrigado pela interação, sei que vc´s num ficam ai de bobeira que nem eu... valeu mesmo.

mais vamos lá eu alterei o botão, ao tentar gravar vem a mensagem "O valor não é valido" referente ao campo estado no SelectMenu, eu coloquei pra printar algo logo no inicio do metodo salvar do MB, mais até este ponto não printou nada, vou mudar agora alguma seleção dos estados e tentar gravar novamente.

- Não deu erro, o dialogo fechou, e no log não mostrou nada, como se não tivesse passado pelo método Salvar, vai ver que é isto mesmo não esta gravando porque não esta fazendo o que deveria 


<p:toolbar>
<p:toolbarGroup>
<p:commandButton icon="fa fa-fw fa-save" title="Salvar"
action="#{municipioC.salvar}" process="itemPanel"
update="@this itemPanel"
oncomplete="closeDialogIfSucess(xhr, status, args, PF('itemDialog'), 'itemDialog')"/>
</p:toolbarGroup>
</p:toolbar>

<h:panelGroup id="itemPanel" layout="block" styleClass="ui-fluid" style="margin-top:10px;">

   <p:messages id="msgDialog" autoUpdate="false" />

   <p:panelGrid columns="2" layout="grid" styleClass="panelgrid-noborder" columnClasses="ui-grid-col-4, ui-grid-col-8">

<p:outputLabel for="nome" value="Municipio:" />
<p:inputText id="nome" value="#{municipioC.municipio.dsMunicipio}" placeholder="Municipio" size="50" />


Sera que este botão num deveria ficar dentro do panelGrid?

Robson

unread,
Jun 29, 2016, 3:04:24 PM6/29/16
to javasf: JavaServer Faces Group
Olá Boa tarde, 

Entendi Rafael, e alterei conforme, descrevi o que houve agora a pouco, num sei se vai ficar confuso porque aqui pra mim a minha mensagem ficou antes, não sei se é algum problema aqui no Navegador.

Robson

unread,
Jun 29, 2016, 3:31:31 PM6/29/16
to javasf: JavaServer Faces Group
Prezados mais uma vez obrigado ai pela interação.

O que eu pude ver é que há uma mensagem sim na tela aquela do p:messages referente ao componente SelectMenu, coisa que na tela sem Dialogo não ocorre, a questão esta então no dialogo, eu não diria nem no converter porque na tela sem o dialogo não tem problema.

- a mensagem aparece Erro de validação: o valor não é valido, mais ai já foi submetido uma vez 
- eu clico insistente no botão e nada ocorre, 
- eu seleciono outro estado no componente e clico em salvar, neste momento não existe erro, o dialogo é fechado mais nada é gravado inclusive parece que nem entra no método de salvar chamado pelo botão.

Obs. Interessante
- Noto também uma coisa , acho que tem algo a ver se eu seleciono o primeiro registro do SelectMenu o erro de validação ocorre
- se é algum outro abaixo do primeiro na seleção a validação não reclama mais também não Grava nada nem aparece nada passando pelo método salvar


Sinceramente não sei, se alguém mais tiver uma ideia diante do exposto agradeço.

Robson

unread,
Jul 2, 2016, 10:59:04 AM7/2/16
to javasf: JavaServer Faces Group
Olá Bom dia.

Prezados infelizmente não sei mais como nem tentar outra coisa para fazer funcionar, acredito que seja algum Bug do PF , sei que é muita pretenção da minha parte pensar isto mais tenho que tentar , não é possivel não funcione com um Dialogo.

Tentei me cadastrar no forum do PF a fim de poder me comunicar com eles mais faz dois dias e não apareceu nenhum e-mail para que eu ative minha conta, tentei logar no forum e lá diz
please contact a board administrator.

alguem sabe como contactar este administrator? não vi nenhum link ou e-mail

Everton Fujimoto

unread,
Jul 2, 2016, 11:15:37 AM7/2/16
to jav...@googlegroups.com
Peguei só uma parte da conversa, mas se vc acha que é bug do primefaces vc pode testar só com o h:selectOneMenu ao invés do p:selectOneMenu. 

Mas, particularmente, eu acho que o @ViewScoped que vc está usando talvez não esteja no pacote certo para essa versão do CDI. Embora eu já tive alguns problemas com o ViewScoped do CDI e passei a usar o do JSF mesmo até ver se solucionam o problema (que na última vez que usei o do CDI já funcionou perfeitamente). 

Outra coisa, verifica se o equals está funcionando perfeitamente mesmo após o objeto ser serializado e desserializado. 

Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Robson

unread,
Jul 2, 2016, 11:25:56 AM7/2/16
to javasf: JavaServer Faces Group
Oi Everton boa tarde.

Acredito que esteja tudo Ok com o equals e o HashCode porque eu dupliquei a tela e fiz ela simples sem o Dialog do PF e funciona
agora posso sim retirar o componente do PF e usar o do JSF , quanto ao escopo View eu estou usando o pacote do CDI

Robson

unread,
Jul 2, 2016, 11:29:12 AM7/2/16
to javasf: JavaServer Faces Group

Segue informações do pom.xml

<!-- Weld - Implementação do CDI -->
<weld.version>2.3.2.Final</weld.version>

<!-- JSF Version -->
<javax.faces.version>2.2.10</javax.faces.version>

e os imports
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.primefaces.event.SelectEvent;

import br.com.dominio.modelo.Estado;
import br.com.dominio.modelo.Municipio;
import br.com.dominio.service.EstadoService;
import br.com.dominio.service.MunicipioService;

Everton Fujimoto

unread,
Jul 2, 2016, 12:06:14 PM7/2/16
to jav...@googlegroups.com
Ah.. estava dentro de um dialog? acho que já tive esse problema com o primefaces... se não me engano na época eu tirei o selectOneMenu do dialog e funcionou perfeitamente... Tive que usar o h:selectOneMenu mesmo. Talvez esse problema ainda exista. 

Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Robson

unread,
Jul 2, 2016, 12:21:07 PM7/2/16
to javasf: JavaServer Faces Group
é Correto, eu dupliquei a tela para testar, tirai o dialogo e funciona, na tela original não funciona.

Mais ainda não testei com o componente do JSF, vou testar e retorno, meu caro obrigado pelo retorno vamos ver se com isto vai funcionar agora será uma pena , então seria um Bug do PF certo?

Robson

unread,
Jul 2, 2016, 1:20:08 PM7/2/16
to javasf: JavaServer Faces Group
Olá!

Não, não funciona com o h:SelectOneMenu, se eu escolho o primeiro item de minha List ocorre o erro de valor invalido e por dar um erro a tela permanece, agora se eu escolho um item alem do primeiro e clico no Gravar a tela ( digo o Dialogo ) fecha não salva absolutamente Nada, nadinha, e eu coloquei um print no Converter

SimpleEntityConverter - getAsObject - valor: 5

ou seja com o componente do PF ou do JSF o comportamento é o mesmo dentro de um Dialogo

:-(

Everton Fujimoto

unread,
Jul 2, 2016, 1:38:51 PM7/2/16
to jav...@googlegroups.com

Uma outra coisa que lembrei, alguns frameworks jsf quando vc usa dialog ele cria um elemento no final da página, então vc tem que colocar um form dentro do dialog para funcionar...  tenta isso para ver se dá certo.

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

- Davi M .

unread,
Jul 2, 2016, 8:15:40 PM7/2/16
to jav...@googlegroups.com
Cara so por desencargo de consciência, bota o dialog num form separado. Isolado  desse único form ai.

De: Robson
Enviada em: ‎28/‎06/‎2016 21:36
Para: javasf: JavaServer Faces Group
Assunto: [javasf] SelectOneMenu - Converter retorna o valor Nulo

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Robson

unread,
Jul 3, 2016, 10:30:31 AM7/3/16
to javasf: JavaServer Faces Group
Olá bom dia, bom Domingo.

Bem gostaria de dizer um Obrigado ao Davi, ao Everton pelas dicas, eu fiz o que pediram, só não entendi se é para colocar uma tag form e Dentro dela o dialogo ou uma tag form Dentro do Dialogo

o que eu fiz foi colocar uma tag form Dentro do Dialogo e não resultou em nenhuma melhora ( Infelizmente ) eu até pensei que seria um caminho.

mais continuo achando estranho os dois comportamentos que eu reportei: 

1) quando eu seleciono o primeiro registro do meu SelectOneMenu recebo o erro se escolher qualquer outro eu não recebo o erro o Dialogo é fechado contudo nada é Salvo
2) o método chamado pelo botão Salvar não chega até o MB.

Sei disto porque eu sai colocando println em tudo o que é método, ( nas entidades, no MB, no converter )  e vou comentar abaixo o que saiu no log quando o botão salvar é chamado

Comentario : uma serie de leitura do atributo 
getMunicipio()
getMunicipio()
getMunicipio()
getMunicipio()
getMunicipio()
getMunicipio()
Comentario : chama o converter e retorna o objeto 
SimpleEntityConverter - getAsObject - valor: 1
SimpleEntityConverter - getAsObject - Retorna o Objeto 
Comentario : novamente a leitura do atributo
getMunicipio()
Comentario : aqui o metodo equals atuando
Estado - equals()
Estado - equals()
Estado - equals()
Estado - equals() Nome: AL
Estado - equals()
Estado - equals() Nome: CE
Estado - equals()
Estado - equals() Nome: PB
Estado - equals()
Estado - equals() Nome: SP
Estado - equals()
Estado - equals() Nome: RJ
Estado - equals()
Estado - equals() Nome: MG
Comentario : uma serie de leitura do atributo municipio novamente
getMunicipio()
getMunicipio()
getMunicipio()
getMunicipio()
Comentario : e por fim a chamada no método que salva e que resulta no Hibernate 
Este metodo não é chamado na tela com dialogo
salvar()
Hibernate: 
    /* insert br.com.dominio.modelo.Municipio
        */ insert 
        into
            municipio
            (cod_ibge, ds_municipio, id_estado) 
        values
            (?, ?, ?)










- Davi M .

unread,
Jul 3, 2016, 1:48:16 PM7/3/16
to jav...@googlegroups.com
Já tentou remover esse oncomplete e ver se o método ta sendo chamado?

De: Robson
Enviada em: ‎03/‎07/‎2016 11:30
Assunto: Re: [javasf] SelectOneMenu - Converter retorna o valor Nulo

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Robson

unread,
Jul 3, 2016, 3:27:11 PM7/3/16
to javasf: JavaServer Faces Group
Olá Boa tarde.


Cara removi e não chamou,  e a bronca? o que houve então? o meu MB.... CDI num tá rolando?

Everton Fujimoto

unread,
Jul 3, 2016, 7:28:39 PM7/3/16
to jav...@googlegroups.com
Resolvi dar uma olhada com mais atenção, olha esse trecho de código:


<p:commandButton icon="fa fa-fw fa-save" title="Salvar"
action="#{municipioC.salvar}" process="itemPanel"
update="itemPanel itensTable"
oncomplete="closeDialogIfSucess(xhr, status, args, PF('itemDialog'), 'itemDialog')" />

Repare no process... Ali no process só tem o painelGroup... tem que ter cada um dos elementos a serem processados (o panelGroup não "inclui os filhos" nesse process) e tem que ter também o próprio commandButton (geralmente utilizando o @this no process... 

Então, o ideal é que seu process fique assim:


process="@this nome ibge estado"

Obs: talvez tenha que adicionar o id do elemento pai, por exemplo:

process="@this :form:itemPanel:nome :form:itemPanel:ibge :form:itemPanel:estado"

Ou simplesmente:
process="@form"


Att.

Everton William Fujimoto
Tecnólogo em Processamento de Dados - Fatec-SO
Especialista em Gestão de Projetos de Software - IGTI
Mestrando em Administração - UFSC
OCAJP, OCPJP, OCEWCD, OCEWSD, OCEJPA, OCEEJB, OCEJSF, 1Z0-807, OCE SQL Expert

Em 3 de julho de 2016 16:27, Robson <robson...@hotmail.com> escreveu:
Olá Boa tarde.


Cara removi e não chamou,  e a bronca? o que houve então? o meu MB.... CDI num tá rolando?

--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Robson

unread,
Jul 4, 2016, 10:27:17 AM7/4/16
to javasf: JavaServer Faces Group
Oi Everton bom dia.

Prezado tenho muito a agradecer a vc´s que interagiram comigo contudo confesso que passada esta semana com esta Maratona eu comecei hoje querendo direcionar para outro assunto, num da pra ficar dois dias em um problema muito menos a semana toda, já pensou se isto fosse um trabalho real. 

Ainda bem que é apenas um aprendizado

mais deixa te dizer diante do que vc expôs, hoje minha alteração baseada nos comentário me fez ter duas tag´s <form uma fora do Dialogo envolvendo a tabela e fora desta tenho o Dialogo e dentro dele a outra tag <form e o meu botão já processa o form só que não fiz como vc indicou

<p:commandButton update=":frm:itensTable" action="#{municipioC.salvar}" 
        process="itemForm"
        icon="fa fa-fw fa-save" title="Salvar"
         oncomplete="closeDialogIfSucess(xhr, status, args, PF('itemDialog'), 'itemDialog')"/>


se eu colocar o process="@form"  não acredito que mudará muita coisa mais vou ver.

Robson

unread,
Jul 7, 2016, 7:00:33 PM7/7/16
to javasf: JavaServer Faces Group
Prezados boa noite.

Passados alguns dias em que parei o projeto hoje resolvi voltar e mudar o Converter fazendo a injeção do Dao, contudo recebo o erro 
jul 07, 2016 7:52:31 PM com.sun.faces.context.PartialViewContextImpl processPartial
INFORMAÇÕES: java.lang.NullPointerException


e mais a frente no console o erro jul 07, 2016 7:52:31 PM com.sun.faces.lifecycle.ProcessValidationsPhase execute
ADVERTÊNCIA: java.lang.NullPointerException
javax.faces.FacesException:

Causado por: java.lang.NullPointerException
at br.com.dominio.conversor.EstadoConverter.getAsObject(EstadoConverter.java:29)

justamente nesta linha é onde o banco é acessado

@FacesConverter(forClass = Estado.class)
public class EstadoConverter implements Converter {
 
    @Inject
    EstadoDao dao ;
    @Override
    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String value) {

    System.out.println("EstadoConverter - getAsObject - valor: "+value);
Estado estado = null;

       if (StringUtils.isNotEmpty(value)){
           Integer Id = Integer.parseInt(value);
           estado = dao.findByID(Id);
       }

     return estado;
    }


Então ... o CDI não esta injetando a instancia do dao? mais no MB as injeções estão sendo feitas e o acesso ao banco não esta tendo problema 



Davi Mustafa

unread,
Jul 7, 2016, 8:18:17 PM7/7/16
to javasf: JavaServer Faces Group
O CDI não ta gerenciando o facesConverter. Tem que fazer um workaround. Cara, tenta um desses converters do Rafael. Eu uso o simple entity converter e da tudo certo.


--
Você recebeu essa mensagem porque está inscrito no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
Acesse esse grupo em https://groups.google.com/group/javasf.

Para mais opções, acesse https://groups.google.com/d/optout.



--
Davi Mustafa

Davi Mustafa

unread,
Jul 7, 2016, 8:24:46 PM7/7/16
to javasf: JavaServer Faces Group
olha isso tambem. Usa o @Named do cdi e faz as mudanças que o cara falou ali no post

--
Davi Mustafa

Arthur Gregório

unread,
Jul 7, 2016, 9:01:19 PM7/7/16
to jav...@googlegroups.com
Não li tudo que foi falado no tópico, mas pq não usam o omnifaces [1]?

O cara que desenvolve eh membro do expert group de JSF e o toolkit que ele fez é bem útil não só para esta questão de converters [2]

Até essa questão de injetar em converter [3] que só vai ter no JSF 2.3 já foi resolvido com o framework.. 

Enfim, fica a dica.. As vezes muitas das coisas que tentam fazer já estão prontas..  


A menos que se queiram muito ou que seja para fins de estudo/conhecer, não vale a pena ficar reinventando a roda...

Robson

unread,
Jul 7, 2016, 10:16:47 PM7/7/16
to javasf: JavaServer Faces Group
Olá boa noite Arthur, Davi
Então já venho a dias tentando resolver o problema, e pelo que vi tudo porque resolvi ter o Diálogo do Pf.
Fico a pensar também se o problema está na injeção no Converter ou se é o Entitymanager o caso agora que resolvi injetar o Dao... Isso procede?
O Omnifaces nunca usei mas para resolver tô tentando tudo amanhã vou experimentar quero resolver essa questão.

Rafael Ponte

unread,
Jul 7, 2016, 10:40:58 PM7/7/16
to javasf: JavaServer Faces Group

--
Você está recebendo esta mensagem porque se inscreveu no grupo "javasf: JavaServer Faces Group" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para javasf+un...@googlegroups.com.
--

Robson

unread,
Jul 8, 2016, 4:31:52 PM7/8/16
to javasf: JavaServer Faces Group

Prezados boa tarde.

Uma boa notícia, pelo visto o problema foi sanado ..... só não entendi o porquê do problema ( que vou expor logo em seguida)  visto que já fazia uso das classes do Modelo da forma como estavam quando iniciei meu projeto com Spring.

A classe que eu alterei foi a de Estado.java e isto foi removido da classe

//bi-directional many-to-one association to Municipio
//@OneToMany(mappedBy="estado")
//private List<Municipio> municipios;

já a classe Municipio.java  ficou com estes comentários  ou seja removi o fetch=LAZY

//bi-directional many-to-one association to Estado
//@ManyToOne(fetch=FetchType.LAZY)
@ManyToOne
@JoinColumn(name="id_estado")
private Estado estado;


Como disse eu não entendi porque o problema se em um projeto anterior com Spring não tinha problema mais vale notar que com Spring no arquivo descritor eu tinha os parâmetros

<filter>
<description>Filtro do Spring para uso do Design Pattern "Open Session in View".</description>
<filter-name>openEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>openEntityManagerInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Se algum dos colegas quiser comentar agradeço muito, e acho que com isto terminou isto que foi pra mim uma verdadeira Maratona.

agradeço a Todos, Davi Mustafa, Rafael Ponte, Fujimoto Everton e ao Arthur ( o cara do webBudget ), um abraço!!!! e vou prosseguir agora no resto, será que vem bronca maior?   

Reply all
Reply to author
Forward
0 new messages