Alguem já realizou essa combinação e teria algum exemplo para postar ???
[RESOLVIDO]picklist"primefaces" + jpa
6 Respostas
Essa combinação é como qualquer outra combinação que retorne o objeto necessário kkkk
vamos pegar o exemplo simples do primefaces:
pagina.xhtml:
<h:form id="form">
<p:panel header="AutoComplete" toggleable="true" id="panel">
<h:panelGrid columns="2" cellpadding="5">
<h:outputLabel value="Simple :" for="acSimple" />
<p:autoComplete id="acSimple" value="#{autoCompleteBean.txt1}"
completeMethod="#{autoCompleteBean.complete}"/>
</h:panelGrid>
</p:panel>
</h:form>
e no código:
package org.primefaces.examples.view;
import java.util.ArrayList;
import java.util.List;
public class AutoCompleteBean {
private String txt1;
public List<String> complete(String query) {
List<String> results = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
results.add(query + i);
}
return results;
}
public String getTxt1() {
return txt1;
}
public void setTxt1(String txt1) {
this.txt1 = txt1;
}
}
seja com JDBC puro, JPA, etc., se for o que o objeto ta esperando, vai funcionar.
Então é porque já tem um tempo que abri um post com um problema mais ninguem conseguiu resolver, como tinha que dar proseguimento ao projeto deixei de lado, mais voltando ao topico vê se você consegue me ajudar.
Eu tenho um picklist de usuarios, quando eu tento acessar a página da esse erro.
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
at org.primefaces.component.picklist.PickListRenderer.encodeOptions(PickListRenderer.java:194)
at org.primefaces.component.picklist.PickListRenderer.encodeList(PickListRenderer.java:177)
at org.primefaces.component.picklist.PickListRenderer.encodeMarkup(PickListRenderer.java:90)
at org.primefaces.component.picklist.PickListRenderer.encodeEnd(PickListRenderer.java:51)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:295)
at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:55)
at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:43)
at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:229)
at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:152)
at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:75)
at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:878)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1620)
at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:848)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1613)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1616)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:380)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:126)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:127)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:313)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
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:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:579)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Segue o codigo:
<p:pickList iconOnly="true" id="usuario"
addAllLabel="Adicionar todos Usuários"
addLabel="Adionar Selecionado" removeLabel="Remover Usuário"
removeAllLabel="Remover todos Usuários"
value="#{sistemaBean.usuarioModel}" var="sistema"
itemLabel="#{sistema.nome}" itemValue="#{sistema.idUsuario}">
<f:facet name="sourceCaption">Usuário(s)</f:facet>
<f:facet name="targetCaption">Vinculado(s) ao sistema</f:facet>
</p:pickList>
mais se eu deixar assim ele mostra a pagina.
itemLabel="#{sistema.nome}" itemValue="#{sistema.nome}">
Só que na hora de gravar ele da um erro de conversão.
//Codigo Bean
private Sistema sistema = new Sistema();
private List<Sistema> sistemas;
private DualListModel<PerfilUsuario> usuarioModel;
private PerfilUsuario perfilUsuario = new PerfilUsuario();
private List<PerfilUsuario> usuariosSelecionados = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> perfilUsuarios;
public String gravar(){
DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);
usuarios = usuarioModel.getSource();
usuariosSelecionados = usuarioModel.getTarget();
if(sistema.getIdSistema() == null){
sistema.setUsuarios(usuariosSelecionados);
dao.adiciona(sistema);
}else{
dao.atualiza(sistema);
}
//Lista os dados em tempo real com o banco
this.sistemas = dao.listaTodos();
//Quando for adicionar chama-se denovo o metodo para limpar os campos
this.sistema = new Sistema();
return "cadastroSistema?faces-redirect=true";
}
Acredito que eu tenha que criar o converter, mais nem sei por onde começa e como vai funcionar o converter para este caso…Alguma sugestão?
Agora que eu vi, eu confundi, my bad :oops: , você está falando do picklist e eu falei do autocomplete kkkk, viajei geral, mas veja só, o seu código apresenta este erro:
java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String
que acontece aqui provavelmenet:
itemLabel="#{sistema.nome}" itemValue="#{sistema.idUsuario}">
ele está esperando um valor que não seja o idUsuario, e sim uma Stering. Como medida de teste, deixe ambos como sistema.nome
Então andre.froes, não sei se eu mencionei mais quando eu deixo destar forma na hora de gravar ele lança esta exceção.
Caused by: javax.persistence.RollbackException: Error while committing the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
at br.com.sisapropriacao.dao.DAO.adiciona(DAO.java:26)
at br.com.sisapropriacao.mb.SistemaBean.gravar(SistemaBean.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:262)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 24 more
Caused by: javax.persistence.PersistenceException: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.sisapropriacao.modelo.PerfilUsuario.idUsuario
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1167)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1100)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81)
… 34 more
Caused by: org.hibernate.PropertyAccessException: could not get a field value by reflection getter of br.com.sisapropriacao.modelo.PerfilUsuario.idUsuario
at org.hibernate.property.DirectPropertyAccessor$DirectGetter.get(DirectPropertyAccessor.java:62)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230)
at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:3845)
at org.hibernate.persister.entity.AbstractEntityPersister.isTransient(AbstractEntityPersister.java:3553)
at org.hibernate.engine.ForeignKeys.isTransient(ForeignKeys.java:204)
at org.hibernate.engine.ForeignKeys.getEntityIdentifierIfNotUnsaved(ForeignKeys.java:243)
at org.hibernate.type.EntityType.getIdentifier(EntityType.java:449)
at org.hibernate.type.ManyToOneType.nullSafeSet(ManyToOneType.java:132)
at org.hibernate.persister.collection.AbstractCollectionPersister.writeElement(AbstractCollectionPersister.java:816)
at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1204)
at org.hibernate.action.CollectionRecreateAction.execute(CollectionRecreateAction.java:58)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:260)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:183)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1206)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:375)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:137)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
… 34 more
Ai eu fiz um teste, tentei deixar desta forma e passar o objeto inteiro na hora de gravar.
sistema.setUsuarios(getPerfilUsuarios());
Desta forma ele grava todos os ID’S dos usuários no banco. Vou postar minha classe modelo, talvez eu esteja fazendo errado o mapeamento.
@Entity
public class Sistema implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idSistema;
private String nomeSistema;
private String descricao;
@ManyToMany(fetch=FetchType.EAGER)
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
public class PerfilUsuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idUsuario;
private String login;
private String senha;
private String nome;
private String endereco;
private String telefone;
private String rg;
private String cpf;
private String complemento;
private String bairro;
private String horaTrabalhada;
@Enumerated(EnumType.STRING)
private TipoUsuario tipoUsuario;
@Enumerated(EnumType.STRING)
private TipoFuncionario tipoFuncionario;
@Valid
@OneToOne
private Gerencia gerenciaVinculado;
@Valid
@OneToOne
private Bairro bairroVinculado;
Alguem?
Então galera depois de muito quebrar a cabeça consegui resolver, bem mais simples do que parece, vamos ao codigo.
Mapeamento @ManyToMany
@Entity
@SessionScoped
public class PerfilUsuario implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idUsuario;
//Atributos
//bi-directional many-to-many associação
@ManyToMany(mappedBy="usuarios", fetch= FetchType.EAGER)
private List<Sistema> sistemas;
//getters e setters
}
@Entity
public class Sistema implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idSistema;
//Atributos
@ManyToMany
@JoinTable(name="sistema_perfilusuario",
joinColumns = {@JoinColumn(name="idSistema")},
inverseJoinColumns = {@JoinColumn(name="idUsuario")})
private List<PerfilUsuario> usuarios;
}
@ManagedBean
@ViewScoped
public class SistemaBean implements Serializable{
private static final long serialVersionUID = 1L;
private Sistema sistema = new Sistema();
private List<Sistema> sistemas;
private DualListModel<PerfilUsuario> usuarioModel;
private PerfilUsuario perfilUsuario = new PerfilUsuario();
private List<PerfilUsuario> usuariosSelecionados = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> usuarios = new ArrayList<PerfilUsuario>();
private List<PerfilUsuario> perfilUsuarios;
public String gravar(){
DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);
usuarios = usuarioModel.getSource();
usuariosSelecionados = usuarioModel.getTarget();
if(sistema.getIdSistema() == null){
sistema.setUsuarios(usuariosSelecionados);
dao.adiciona(sistema);
}else{
dao.atualiza(sistema);
}
//Lista os dados em tempo real com o banco
this.sistemas = dao.listaTodos();
//Quando for adicionar chama-se denovo o metodo para limpar os campos
this.sistema = new Sistema();
return "cadastroSistema?faces-redirect=true";
}
public DualListModel<PerfilUsuario> getUsuarioModel(){
if(this.usuarioModel==null){
this.usuarioModel = new DualListModel<PerfilUsuario>(getPerfilUsuarios(), new ArrayList<PerfilUsuario>());
}
return this.usuarioModel;
}
}
E a mais importante a classe converter.
@FacesConverter(value = "PerfilUsuarioConverter")
public class PerfilUsuarioConverter implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
Object ret = null;
if (arg1 instanceof PickList) {
Object dualList = ((PickList) arg1).getValue();
DualListModel dl = (DualListModel) dualList;
for (Object o : dl.getSource()) {
String id = "" + ((PerfilUsuario) o).getIdUsuario();
if (arg2.equals(id)) {
ret = o;
break;
}
}
if (ret == null)
for (Object o : dl.getTarget()) {
String id = "" + ((PerfilUsuario) o).getIdUsuario();
if (arg2.equals(id)) {
ret = o;
break;
}
}
}
return ret;
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
String str = "";
if (arg2 instanceof PerfilUsuario) {
str = "" + ((PerfilUsuario) arg2).getIdUsuario();
}
return str;
}
}
E a pagina xhtml
<h:outputLabel value="Vincular Usuário(s):" for="usuario" />
<p:pickList iconOnly="true" id="usuario" converter="PerfilUsuarioConverter"
addAllLabel="Adicionar todos Usuários"
addLabel="Adionar Selecionado" removeLabel="Remover Usuário"
removeAllLabel="Remover todos Usuários"
value="#{sistemaBean.usuarioModel}" var="sistema"
itemLabel="#{sistema.nome}" itemValue="#{sistema}">
<f:facet name="sourceCaption">Usuário(s)</f:facet>
<f:facet name="targetCaption">Vinculado(s) ao sistema</f:facet>
</p:pickList>
E isso ai galera desculpa se ficou um pouco grande mais e a solução do problema caso alguem precise. Obrigado a todos.