Renderizar dados do datatable de acordo com usuário logado

2 respostas
cassioliveira

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>`

2 Respostas

D

Boa tarde,
Cassio, posta o código da classe Product e da sua tabela correspondente.

Provavelmente vc fez o ajuste do usuário após o desenvolvimento inicial, eu arrisco que seja algo relacionado a deployment, acredito que as classes de persistência estejam desatualizadas no container ou algo do tipo.

cassioliveira

Desculpa pois há muito tempo que não acesso o GUJ e devo ter perdido a notificação da sua resposta. De qualquer forma, eu alterei tantas coisas que acabou funcionando. Se, no futuro, alguém precisar, posto os códigos aqui. Como tô meio sem tempo agora por conta do TCC, postarei caso alguém precise. Valeu!

Criado 24 de janeiro de 2016
Ultima resposta 3 de abr. de 2016
Respostas 2
Participantes 2