Fórum Popular uma Lista com autocomplete do primefaces #448191

09/07/2013

0

Pessoal estou em uma dúvida cruel , e isso esta me tomando algum tempo e os neurônios que tinha pra queima nisso já queimaram, como sou novato nesse maravilhoso mundo da programação estou sentindo dificuldades então bora lá .

bom criei o botão no meu caso ele esta assim

 <p:autoComplete id="acTeacher" size="40" value = "#{studentsRoomFace.studentRoom.teacherOf}" 
 completeMethod="#{studentsRoomFace.completeTeachearOfStudentRoom}"  converter="teacherConverter"></p:autoComplete>

Ok, até ai tudo bem.

ta ok agora eu tenho uma classe que esta assim 


public class StudentRoom implements Serializable {
    private static final long serialVersionUID = 1L;
 @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Basic
    @Column(name="id")
    private Integer id;
    
    @OneToMany(mappedBy="studentRoomOf")
    private List<Teacher> teacherOf;

    @Column(nullable=false,length=100)
    private String name;
    

//get set


Bom agora o que eu gostaria de fazer é pegar dessa lista de professores o nome do professor e popular ele pelo autocomplete
no caso eu criei um método assim.

public List<Teacher> completeTeachearOfStudentRoom(String busca) {
        List<Teacher> results = new ArrayList<Teacher>();
        for (Teacher teacher : teachers) {
            if(teacher.getName().contains(busca)){
                results.add(teacher);
            }
        }
        return results;
    }



e tipo ele não me da erro mais também não preenche o meu <p:autocomplete> ... será que alguém poderia me esclarecer essa dúvida cruel.
desde já agradeço
Leonardo Silva

Leonardo Silva

Responder

Posts

09/07/2013

Marcelo Senaga

Como você está retornando um objeto, precisa usar o converter:

http://www.primefaces.org/showcase/ui/autoCompletePojo.jsf
Responder

Gostei + 0

10/07/2013

Leonardo Silva

Olá DevMaster bom dia, seguinte eu adicionei alguns elementos na minha linha de código eu vo colar aqui pra você da uma analisada, bom primeiro irei colar a página xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE composition PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets"
template="./base.xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core">

<ui:define name="title">
Gerente Musical - Professores - Cadastro de Turmas
</ui:define>


<ui:define name="metadata">
<f:metadata>
<f:viewParam required="false" name="teacher" value="#{studentsRoomFace.selectedBean}">
<f:converter converterId="teacherConverter"/>
</f:viewParam>
</f:metadata>
</ui:define>


<ui:define name="content">
<h:form>
<p:panel id="panelCadTeacher" menuTitle="Cadastro de Turmas" header="Cadastro de Turmas" style="padding-left: 365px; background-color: #AFAFAF;">
<h:panelGrid columns="3" bgcolor=" #c9c986" style=" position: relative;" >

<h:outputLabel value="Professor :"/>
<p:autoComplete id="acTeacher" size="40" value = "#{studentsRoomFace.selectedBean.teacherOf}"
completeMethod="#{studentsRoomFace.completeTeachearOfStudentRoom}" >

</p:autoComplete>
<br/>
<h:outputLabel for="txtNameOfRoom" value="Sala :"/>
<h:inputText id="txtNameOfRoom" size="46" />
<p:message for="txtNameOfRoom"/>
</h:panelGrid>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/> <br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
</p:panel>
</h:form>
</ui:define>
</ui:composition>


ok vamos agora aos métodos ...

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.musicmanager.entity;
/**
*
* @author leonardo
*/
@Entity
@Table
public class StudentRoom implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Basic
@Column(name="id")
private Integer id;

@OneToMany(mappedBy="studentRoomOf")
private List<Teacher> teacherOf;

@Column(nullable=false,length=100)
private String name;


public void addTeacher(Teacher tc){
tc.setStudentRoomOf(this);
getTeacherOf().add(tc);
}


public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public List<Teacher> getTeacherOf() {
return teacherOf;
}

public void setTeacherOf(List<Teacher> teacherOf) {
this.teacherOf = teacherOf;
}




@Override
public int hashCode() {
int hash = 0;
hash += (id != null ? id.hashCode() : 0);
return hash;
}

@Override
public boolean equals(Object object) {
// TODO: Warning - this method won't work in the case the id fields are not set
if (!(object instanceof StudentRoom)) {
return false;
}
StudentRoom other = (StudentRoom) object;
if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
return false;
}
return true;
}

@Override
public String toString() {
return "br.com.musicmanager.entity.RoomUsed[ id=" + id + " ]";
}

}


a minha classe face que faz a iteração...

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.musicmanager.face;

import br.com.musicmanager.entity.StudentRoom;
import br.com.musicmanager.entity.Teacher;
import br.com.musicmanager.session.SchoolSession;
import br.com.musicmanager.session.TeacherSession;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;

/**
*
* @author Leonardo
*/
@ManagedBean
@SessionScoped
public class StudentsRoomFace extends BaseCDIBean<StudentRoom> {

@Inject
private SchoolSession bean;
private Teacher teacher;
@Inject
private TeacherSession teacherBean;
private List<Teacher> teachers;
private StudentRoom studentRoom;

public String doAddNewStudentRoom() {
setSelectedBean(new StudentRoom());
return "/schools/addnewstudentsroom.faces";
}

public String doFinishAddNewStudentRoom() {
return null;
}

//percorra cada elemento teacher existente dentro de teachers
public List<Teacher> completeTeachearOfStudentRoom(String busca) {
List<Teacher> results = new ArrayList<Teacher>();
for (Teacher teacher : teachers) {
if(teacher.getName().contains(busca)){
results.add(teacher);
}
}
return results;
}

public List<Teacher> getTeachers() {
return teachers;
}

public void setTeachers(List<Teacher> teachers) {
this.teachers = teachers;
}

public String doListPanelOfStudentRoom() {
return "/schools/studentsroompanel.faces";
}

public StudentRoom getStudentRoom() {
return studentRoom;
}

public void setStudentRoom(StudentRoom studentRoom) {
this.studentRoom = studentRoom;
}
}



e também agora minha classe converter que eu criei...

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.com.musicmanager.face.converter;

import br.com.musicmanager.ManualCDILookup;
import br.com.musicmanager.entity.Teacher;
import br.com.musicmanager.session.TeacherSession;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

/**
*
* @author Leonardo
*/
@FacesConverter(value = "teacherConverter")
public class TeacherConverter extends ManualCDILookup implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null) {
TeacherSession bean = getFacadeWithJNDI(TeacherSession.class);
Teacher tch = bean.getTeachersByName(value);
return tch;
}
return null;
}

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null) {
Teacher tch = (Teacher) value;
return tch.getName();
}
return null;
}
}



para me retornar o nome do professor, bom ai que me pintou outra duvida depois de ter feito tudo isso , o que mais me chamou
a atenção foi que quando eu inseri os comandos no xhtml ...
<ui:define name="metadata">
<f:metadata>
<f:viewParam required="false" name="teacher" value="#{studentsRoomFace.selectedBean}">
<f:converter converterId="teacherConverter"/>
</f:viewParam>
</f:metadata>
</ui:define>

combinando-os com o autocomplete ele me gerou um erro de classCastException...



java.lang.ClassCastException: br.com.musicmanager.entity.StudentRoom cannot be cast to br.com.musicmanager.entity.Teacher
at br.com.musicmanager.face.converter.TeacherConverter.getAsString(TeacherConverter.java:35)
at javax.faces.component.UIViewParameter.getStringValueFromModel(UIViewParameter.java:378)
at javax.faces.component.UIViewParameter.getStringValue(UIViewParameter.java:327)
at javax.faces.component.UIViewParameter.encodeAll(UIViewParameter.java:313)
at javax.faces.component.UIViewRoot.encodeViewParameters(UIViewRoot.java:1665)
at javax.faces.component.UIViewRoot.encodeEnd(UIViewRoot.java:1004)
at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1764)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
at javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:288)
at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
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:594)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:722)

Então pelo que eu consegui entender foi que ele não conseguiu fazer o cast entre a classe studentRoom e teacher, se alguém
pude me ajudar eu agradeço muito , Obrigado !, já não consigo intender o que acontece





Responder

Gostei + 0

10/07/2013

Marcelo Senaga

Onde está definido o studentsRoomFace.selectedBean?

Poste o código.
Responder

Gostei + 0

11/07/2013

Leonardo Silva

Grande amigo DevMaster está ai ...

@ManagedBean
@SessionScoped
public class StudentsRoomFace extends BaseCDIBean<StudentRoom> {

    @Inject
    private SchoolSession bean;
    private Teacher teacher;
    @Inject
    private TeacherSession teacherBean;
    
    private List<Teacher> teachers;
    private StudentRoom studentRoom;

    public StudentsRoomFace() {
     
    }

public String doAddNewStudentRoom() {
        setSelectedBean(new StudentRoom());
        return "/schools/addnewstudentsroom.faces";
    }

    public String doFinishAddNewStudentRoom() {
        return null;
    }

    //percorra cada elemento teacher existente dentro de teachers
    public List<Teacher> completeTeachearOfStudentRoom(String busca) {
        List<Teacher> results = new ArrayList<Teacher>();
        for (Teacher teacher : teachers) {
            if(teacher.getName().contains(busca)){
                results.add(teacher);
            }
        }
        return results;
    }

    public List<Teacher> getTeachers() {
        return teachers;
    }

    public void setTeachers(List<Teacher> teachers) {
        this.teachers = teachers;
    }

    public String doListPanelOfStudentRoom() {
        return "/schools/studentsroompanel.faces";
    }

    public StudentRoom getStudentRoom() {
        return studentRoom;
    }

    public void setStudentRoom(StudentRoom studentRoom) {
        this.studentRoom = studentRoom;
    }

    public Teacher getTeacher() {
        return teacher;
    }

    public void setTeacher(Teacher teacher) {
        this.teacher = teacher;
    }
    
   }


desde já agradeço a atenção
Responder

Gostei + 0

11/07/2013

Marcelo Senaga

hum...

Aqui.

public String doAddNewStudentRoom() {
setSelectedBean(new StudentRoom());
return "/schools/addnewstudentsroom.faces";
}


Vc seta o selectBean como sendo StudentRoom.
Porém o converter espera um:
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value != null) {
Teacher tch = (Teacher) value;
return tch.getName();
}
return null;
}
}


É esse o problema.
Por que você está usando esse código?
<f:viewParam required="false" name="teacher" value="#{studentsRoomFace.selectedBean}">
<f:converter converterId="teacherConverter"/>
</f:viewParam>


E não deveria ser:

<f:viewParam required="false" name="teacher" value="#{studentsRoomFace.teacher}">
<f:converter converterId="teacherConverter"/>
</f:viewParam>


Não esquecer do get/set do teacher:

private Teacher teacher;





Responder

Gostei + 0

12/07/2013

Leonardo Silva

Opa bom dia DevMaster, então eu acho que ai mata a maior charada , a unica coisa que eu estou me perdendo agora é que eu tenho que gravar o professor que vai utilizar a sala ... lá na entidade StudentRoom eu criei um campo assim


@OneToMany
private List<Teacher> teacher;

com esse campo que eu estou tentando fazer lá eu quero pegar um Teacher que esta gravado no banco e salvar ele na tabela StudentRoom. isso que esta meio confuso ...
Responder

Gostei + 0

14/07/2013

Marcelo Senaga

Está confuso mesmo. Você poderia criar uma variável Teacher no seu ManagedBean, ao invés de tentar usar o da entidade. E depois que essa variável for salva, atribuir ela a essa lista de Teacher e usar o Hibernate.
Responder

Gostei + 0

15/07/2013

Leonardo Silva

Bom dia devmaster , será que você poderia mostrar um exemplo desse comando, pois acho que nunca fiz esse tipo de relacionamento... ou se tiver algum post ou video ou alguma coisa para pesquisar dentro do site DevMedia , você pode me passar e eu irei tentar encontrar esses exemplos... Agradeço muito sua atenção
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar