Bom dia pessoal, já quebrei a cabeça aqui mas não estou enxergando o problema e gostaria de ajuda. Vou tentar descrever a situação:
Tenho um sistema pequeno e bem simples onde vários usuários terão acesso ao CRUD de produtos, só que cada usuário só poderá ver o produto que ele cadastrou, que é exibido em um datatable primefaces. Eu adicionei um atributo na classe de modelo do produto para receber o nome de usuário logado, assim tenho um método que faz uma consulta ao banco e que retorna apenas os produtos do usuário logado. Eu rodei essa consulta no PGAdmin e os retornos lá estão perfeitos, além de que já exibi o retorno da consulta na IDE e também está certinho.
O problema é que quando chamo a tela de consulta com o datatable, surge um erro dizendo que um atributo do produto não existe, como se não o encontrasse.
Mensagem de erro:
Severe: ERRO NO SISTEMA: /produto/PesquisaProduto.xhtml @38,90 value="#{product.code}": The class 'org.postgresql.util.PGobject' does not have the property 'code'. javax.el.PropertyNotFoundException: /produto/PesquisaProduto.xhtml @38,90 value="#{product.code}": The class 'org.postgresql.util.PGobject' does not have the property 'code'.
Outro detalhe que pode influenciar, um usuário que não tenha produtos cadastrados ainda, não apresenta esse erro e consigo acessar tanto a pagina de cadastro quanto a pagina de pesquisa. O problema só acontece quando o usuário em questão tem produtos cadastrados com seu nome.
TECNOLOGIAS: JavaEE, JSF, Primefaces, CDI, Postgresql, Apache Shiro, Glassfish 4.1.1 e JPA.
Eis alguns códigos:
//CONSULTA DE PRODUTOS DE ACORDO COM O USUARIO QUE CADASTROU O MESMO public List<Product> findByUser(String user) { Query createQuery; createQuery = getEntityManager().createNativeQuery("SELECT p FROM Product p WHERE p.product_associated_user_name = '" + user +"'"); return createQuery.getResultList(); }
//METODO DA CAMADA DE SERVIÇO QUE CHAMA O METODO DO DAO QUE FAZ A CONSULTA E RETORNA PARA UM LIST
public List findByUser(String user) {
return productDao.findByUser(user);
}`
//METODO DO MANAGED BEAN QUE CAPTURA O USUÁRIO LOGADO E REPASSA COMO PARAMETRO PARA O MÉTODO QUE TEM A CONSULTA public void getFindByUser(){ productServices.findByUser((String) SecurityUtils.getSubject().getPrincipal()); }
`//DATATABLE SIMPLES QUE RECEBE OS PRODUTOS DO METODO QUE CHAMA A CONSULTA
<p:dataTable id=“datatableproduct” var=“product” value="#{productBean.findByUser}">
<p:column headerText=“Código” filterMatchMode=“contains” width=“2%“
filterStyle=“display:none” filterBy=”#{product.code}”>
<h:outputText value="#{product.code}" style=“text-align: left”/>
</p:column>
//…DEMAIS ATRIBUTOS…
</p:dataTable>`