Fórum AutoComplete Primefaces + BD Como fazer? #562485
19/09/2016
0
Estou tendo dificuldade em resolver um problema com o AutoComplete do Primefaces. Busquei no próprio site do Prime como fazer, mas nele mostra como realizar usando um ArrayList, e eu quero que busque do BD. Não tenho ideia de como posso resolver isso. Agradeço a ajuda deis de já. Ai vai o código que estou utilizando.
Parte da Pagina xhtml:
<p:dialog header="Nova Visita" widgetVar="dialogo2" draggable="true"
width="790" height="400" resizable="false" modal="true"
closable="false" position="center">
<h:form id="formNovaVisita" enctype="multipart/form-data">
<h:panelGrid columns="2" id="painel2">
<p:outputLabel for="code2" value="Cpf/RG:" />
<!-- AUTOCOMPLETE-->
<p:autoComplete id="code2" value="#{autoCompleteView.visitante}"
completeMethod="#{autoCompleteView.completeVisita}" size="16"
var="dv" itemLabel="#{dv.code}" itemValue="#"
converter="visitanteConverter" forceSelection="true"
requiredMessage="O campo CPF/RG é obrigatorio"
validatorMessage="O numero minimo de caracteres permitido é de 5 caracteres">
<f:validateLength maximum="15" minimum="5" />
<f:facet name="itemtip">
<h:panelGrid columns="2" cellpadding="5">
<f:facet name="header">
<h:graphicImage width="50"
url="http://localhost:8080/uploads/#{v.code}.png"
style="margin-left:50px" />
</f:facet>
<h:outputText value="Nome:" />
<h:outputText value="#{dv.nome}" />
<h:outputText value="Empresa:" />
<h:outputText value="#{dv.empresa}" />
</h:panelGrid>
</f:facet>
</p:autoComplete>
<p:outputLabel for="nome2" value="Nome:" />
<p:inputText id="nome2" maxlength="40" size="40" type="text"
required="true" requiredMessage="O campo Nome é obrigatorio"
value="#{visitanteBean.visitante.nome}" forceSelection="true"/>
<p:outputLabel for="empresa2" value="Nome da empresa:" />
<p:autoComplete id="empresa2" maxlength="45" size="40"
required="true"
requiredMessage="O campo Nome da Empresa é obrigatorio"
value="#{visitanteBean.visitante.empresa}" forceSelection="true">
</p:autoComplete>
<p:outputLabel for="obs" value="Observações da Visita:" />
<p:inputTextarea id="obs" maxlength="200" size="60"
value="#{visitanteBean.visitante.obs}" />
<p:outputLabel for="subir" value="Foto:" />
<h:panelGrid columns="2" id="painelFoto">
<h:graphicImage width="150"
url="http://localhost:8080/uploads/#{dv.code}.png" />
<p:fileUpload id="subir" label="Procurar" mode="advanced"
fileUploadListener="#{visitanteBean.subir}"
invalidFileMessage="Tipo de Arquivo incorreto"
invalidSizeMessage="Foto muito grande" update=":msg" auto="true"
allowTypes="/(\\.|\\/)(gif|jpe?g|png)$/" />
</h:panelGrid>
</h:panelGrid>
<h:panelGrid columns="3">
<p:commandButton value="Salvar"
actionListener="#{visitanteBean.salvar}"
update=":formLista:table :msg :formNovaVisita:painel2" />
<p:commandButton value="Limpar" ajax="true" immediate="true"
type="reset" />
<p:commandButton value="Fechar" oncomplete="PF('dialogo2').hide();" />
</h:panelGrid>
</h:form>
</p:dialog>
Visitante Converter:
@FacesConverter("visitanteConverter")
public class VisitanteConverter implements Converter {
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if(value != null && value.trim().length() > 0) {
try {
VisitaService service = (VisitaService) fc.getExternalContext().getApplicationMap().get("visitaService");
return service.getVisitas().get(Integer.parseInt(value));
} catch(NumberFormatException e) {
throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de conversão", "Visitante não é valido."));
}
}
else {
return null;
}
}
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
if(object != null) {
return String.valueOf(((Visitante) object).getCodigo());
}
else {
return null;
}
}
}
Visita Service:
@ManagedBean(name="visitaService", eager = true)
@ApplicationScoped
public class VisitaService {
private List<Visitante> visitas;
public List<Visitante> getVisitas() {
return visitas;
}
public void setVisitas(List<Visitante> visitas) {
this.visitas = visitas;
}
}
Jonathan
Curtir tópico
+ 0Post mais votado
19/09/2016
No seu Service, você deve acessar o DAO de sua aplicação, realizando a busca dos dados, retornando em uma lista. Exatamente a forma que é explicada no site do Primefaces.
Segundo as boas práticas, você não deve realizar acesso a dados diretamente na camada de visão. Ela deve acessar a camada de persistência, buscando as informações e retornando listas do seu objeto. O primfaces deve receber apenas a lista, e não deve receber nada relacionado ao banco de dados.
Esses conceitos estão relacionados ao acoplamento da sua aplicação, ou seja. Você não deve acoplar a camada de visão ao banco de dados.
A forma mais correta é esta mesmo.
Qualquer dúvida, estou a disposição.
Wesley Fuchter
Gostei + 2
Mais Posts
19/09/2016
Jonathan
Gostei + 0
19/09/2016
Jonathan
@ManagedBean(name="visitaService", eager = true)
@ApplicationScoped
public class VisitaService {
private List<Visitante> visitas;
@PostConstruct
public void init() {
try {
visitas = new ArrayList<Visitante>();
VisitanteDAO dao = new VisitanteDAO();
visitas = dao.listar();
} catch (RuntimeException e) {
Messages.addGlobalError("Erro ao listar");
e.printStackTrace();
}
}
public List<Visitante> getVisitas() {
return visitas;
}
}
Gostei + 0
19/09/2016
Wesley Fuchter
É basicamente isso. O DAO buscará os dados no banco de dados. Na visão, basta chamar o método DAO e está OK. Dessa forma, você não tem o DAO e a visão acoplados. Se precisar mudar a tecnologia de acesso a dados, nada impactará na sua visão.
Abraços!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)