Fórum Popular uma Lista com autocomplete do primefaces #448191
09/07/2013
0
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 setBom 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
Curtir tópico
+ 0Posts
09/07/2013
Marcelo Senaga
http://www.primefaces.org/showcase/ui/autoCompletePojo.jsf
Gostei + 0
10/07/2013
Leonardo Silva
<?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
Gostei + 0
10/07/2013
Marcelo Senaga
Poste o código.
Gostei + 0
11/07/2013
Leonardo Silva
@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
Gostei + 0
11/07/2013
Marcelo Senaga
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;
Gostei + 0
12/07/2013
Leonardo Silva
@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 ...
Gostei + 0
14/07/2013
Marcelo Senaga
Gostei + 0
15/07/2013
Leonardo Silva
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)