utilizado: Jsf 2.0, richfaces 4.0 , jpa e servidor tomcat.
Bom pessoa estou nessa luta tem quase duas semanas, como eu não trabalho com java estudo por conta própria.
Estou fazendo um campo de pesquisa como se fosse o like, o usuário digita um nome, exemplo: jo e irá aparecer todos os nomes correspondentes. Só que não estou conseguindo setar os atributos fala que existe mais de um atributo definido. vamos ao código.
Bom pessoa, sei que esse componentes requer string, mas não estou conseguindo setar o atributo para imprimir string, me ajudem se eu estiver enganado.
Obrigado
Dao
public List<Cliente> listar(String nome){
em.getTransaction().begin();
Query query = em.createNativeQuery("select * from cliente " +
"where upper(nome) like upper(:nome)", Cliente.class);
query.setParameter("nome", "%" + nome + "%");
List<Cliente> clies = query.getResultList();
em.getTransaction().commit();
return clies;
}
Been
public List<Cliente> listarClientes(Object nome){
return clienteDao.listar(nome.toString());
}
xhtml
<h:inputText value="#{clienteControl.cliente.nome}" id='clie'></h:inputText>
<h:commandButton action="#{clienteControl.listarClientes}" value="Listar" for='clie'></h:commandButton>
<rich:dataTable value="#{clienteControl.clientes}" var="cliente"
width="804px;">
<f:facet name="header">
<h:outputText value="Clientes"></h:outputText>
</f:facet>
<rich:column>
<f:facet name="header">
<h:outputText value="Nome"></h:outputText>
</f:facet>
<h:outputText value="#{cliente.nome }"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Endereco"></h:outputText>
</f:facet>
<h:outputText value="#{cliente.endereco}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Setor"></h:outputText>
</f:facet>
<h:outputText value="#{cliente.setor}"></h:outputText>
</rich:column>
<rich:column>
<f:facet name="header">
<h:outputText value="Cidade"></h:outputText>
</f:facet>
<h:outputText value="#{cliente.cidade}"></h:outputText>
</rich:column>
<rich:column>
<h:commandLink action="#{clienteControl.excluir }"
onclick="return confirm('Certeza?');">
<f:setPropertyActionListener value="#{cliente}"
target="#{clienteControl.cliente }" />
<h:graphicImage value="excluir.png" style="border:none"></h:graphicImage>
</h:commandLink>
<h:commandLink>
<f:setPropertyActionListener value="#{cliente}"
target="#{clienteControl.cliente }" />
<h:graphicImage value="editar.png" style="border:none"></h:graphicImage>
</h:commandLink>
</rich:column>
</rich:dataTable>
Por que não está conseguindo? é lançada alguma exceção ?
Acho que encontrei o problema… altere a linha:query.setParameter("nome", "%" + nome + "%");
por query.setParameter("nome", "%"+ cliente.getNome() + "%");
fez sentido ?
Não lancei nenhuma exceção, quando não defino nenhum parametro e listo tudo não apresenta erro.
Testou o código que eu te passei ?
vou utilizar um Action ou value? para listar.
os dois dão erros
[quote=digaoneves]Acho que encontrei o problema… altere a linha:query.setParameter("nome", "%" + nome + "%");
por query.setParameter("nome", "%"+ cliente.getNome() + "%");
fez sentido ?[/quote]
este nome não é o nome da classe, mas sim do parametro. mas fiz o teste tbm.
se vai invocar uma ação no seu bean, use o action, como está feito no seu commandButton, qual o erro que foi gerado agora com a alteração que eu sugeri ?
[quote=weldermartins][quote=digaoneves]Acho que encontrei o problema… altere a linha:query.setParameter("nome", "%" + nome + "%");
por query.setParameter("nome", "%"+ cliente.getNome() + "%");
fez sentido ?[/quote]
este nome não é o nome da classe, mas sim do parametro. mas fiz o teste tbm.[/quote]
Eu sei, mas o value que você tem setado via EL no seu inputText, é o da classe, você não envia nenhum parâmetro na sua action, portanto o nome que você espera receber como parâmetro, é nulo.
Certo, fiz como está no seu exemplo mas dá erro nesta linha, parece que não é permitido.
<h:commandButton action="#{clienteControl.listarClientes}" value="Listar"></h:commandButton>
ERRO
java.lang.IllegalArgumentException: cliente]
poste o erro, se houver uma stacktrace, cole ela aqui, vamos analisar
Tenho um projeto em duas versões, estou postando com jsp.
Grave: org.apache.jasper.el.JspMethodNotFoundException: /cliente.jsp(38,5) '#{clienteControl.listarClientes}' Method not found: loja.ClienteControl@1104d7c.listarClientes()
javax.faces.el.MethodNotFoundException: org.apache.jasper.el.JspMethodNotFoundException: /cliente.jsp(38,5) '#{clienteControl.listarClientes}' Method not found: loja.ClienteControl@1104d7c.listarClientes()
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:92)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:387)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:324)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:299)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:256)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:469)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:304)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: org.apache.jasper.el.JspMethodNotFoundException: /cliente.jsp(38,5) '#{clienteControl.listarClientes}' Method not found: loja.ClienteControl@1104d7c.listarClientes()
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:73)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 32 more
voce escreveu sem querer cliente] em algum lugar? com o colchete?
Tinha pegado um log antigo, atualizei.
Esse método existe, e não está localizando.
ele está dizendo que você não tem o método listarClientes() no seu ManagedBean, o que é verdade, porque o nome do método é listar()
o metodo do Dao é listar, mas o do been é listarClientes, veja no código na primeira página.
ah sim, desculpe, é o parâmetro, você está chamando o método sem enviar nada, sendo que na assinatura do método, é esperada uma String.
foi por isso que falei pra você fazer a primeira alteração, agora remova o parâmetro na assinatura do seu método listarClientes(), pois o valor do nome que você quer ja está no seu ManagedBean.
não apresentou erro, mas a grid não foi preenchida.