sábado, 12 de março de 2016

Erro Hibernate: org.hibernate.PropertyAccessException

Olá pessoal, nesse post vou tratar sobre um erro de acesso a propriedade que ocorre no Hibernate, porém a origem está no JSF ou Primefaces que por algum motivo não conseguem reconhecer um conversor para um de suas propriedades.

Primeiro vamos entender a situação. Eu tinha um objeto Carro que tinha um relacionamento ManyToMany para acessórios. Quem é acostumado com JSF sabe que precisamos criar conversores para os nossos objetos, de forma que através destes conversores o JSF consegue levar esse objeto para a tela do usuário exibindo no navegador e após um submit do usuário, o JSF traz as informações desses objetos para o nosso Bean gerenciável, seja ele um bean JSF, CDI, etc.

Então eu criei também os conversores especificando-os para a classe desejada:

@FacesConverter(forClass=Acessorio.class)
@FacesConverter(forClass=Carro.class)

De forma que estava conseguindo usar os objetos normalmente. Quando especificamos um conversor dessa forma, sabemos que podemos usar o nosso objeto em qualquer componente JSF, Primefaces, ou de outra biblioteca de componentes ricos sem ter que especificar no componente. Porém, usando o Primefaces, tentei carregar esses objetos to tipo Acessorio em um componente chamado <p:selectManyCheckbox> e quando tentava salvar o objeto carro a mensagem de erro era a seguinte:

org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.sistema.model.Acessorio.codigo

      Depois de verificar toda minha implementação (Objeto, DAO, Conversor, etc), eu inspecionei o HTML gerado na tela e percebi que esse componente do Primefaces <p:selectManyCheckbox> na versão que estava usando não estava conseguindo aplicar o converter especificado para o objeto, e no value das opções do checkbox gerado no navegador estava uma string que representava o objeto e não o código do objeto Acessório.

         Solução: Como o converter funcionava para outros componentes do Primefaces, percebi que era um problema do componente e especifiquei apenas para este componente (<p:selectManyCheckbox>) o converter através da TAG converter e inclui o nome do converter na classe do converter ficando assim:

Converter:

@FacesConverter(value=”acessorioConverter”,forClass=Acessorio.class)

CadastroCarro.xhtml:

<p:outputLabel value="Acessórios" for="acessorios"/>
<p:selectManyCheckbox id="acessorios" styleClass="many-checkbox" value="#{cadastroCarroBean.carro.acessorios}" converter="acessorioConverter">

<f:selectItems value="#{cadastroCarroBean.acessorios}" var="acessorio" itemLabel="#{acessorio.descricao}" itemValue="#{acessorio}" />


</p:selectManyCheckbox>

Então fica a dica, verificando o objeto e o converter e estando tudo OK, tente especificar o converter dentro do próprio componente que está usando.


Outra dica que posso dar a esse respeito é que alguns componentes do primefaces que trabalham com coleções, tem uma propriedade chamada collectionType para especificarmos que tipo de coleção estamos trabalhando, se é ArrayList, um HashMap, etc... Isso pode evitar alguns erros... Veja abaixo o uso da collectionType.

<p:outputLabel value="Acessórios" for="acessorios"/><p:selectManyCheckbox collectionType="java.util.ArrayList" id="acessorios" styleClass="many-checkbox" value="#{cadastroCarroBean.carro.acessorios}"converter="acessorioConverter">
      
<f:selectItems value="#{cadastroCarroBean.acessorios}" var="acessorio"
itemLabel="#{acessorio.descricao}" itemValue="#{acessorio}" />

</p:selectManyCheckbox>





3 comentários:

  1. Boa dia Daniel
    Muito bom seu cometário venho acompanhando
    Fiz o que vc sugeriu neste post porém continua dando erro conversão no meu enum

    ResponderExcluir
    Respostas
    1. Olá Reginho Souza, você pode postar o erro, o código do componente que vc implementou, o código do ManagedBean (apenas o que for referente ao componente) e o seu conversor para eu poder ajudar você?

      Excluir
    2. Talvez esta nova postagem te ajude:

      http://olamundo-java.blogspot.com.br/2016/04/trabalhando-com-enum-no-jsfprimefaces.html

      Excluir