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.
<p:outputLabel value="Acessórios" for="acessorios"/><p:selectManyCheckbox collectionType="java.util.ArrayList" id="acessorios" styleClass="many-checkbox" value="#{cadastroCarroBean.carro.acessorios}"converter="acessorioConverter">
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.
<f:selectItems value="#{cadastroCarroBean.acessorios}" var="acessorio"
itemLabel="#{acessorio.descricao}" itemValue="#{acessorio}" />
</p:selectManyCheckbox>
Boa dia Daniel
ResponderExcluirMuito bom seu cometário venho acompanhando
Fiz o que vc sugeriu neste post porém continua dando erro conversão no meu enum
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ê?
ExcluirTalvez esta nova postagem te ajude:
Excluirhttp://olamundo-java.blogspot.com.br/2016/04/trabalhando-com-enum-no-jsfprimefaces.html