e aew galera blz. bom, estou escrevendo minha duvida aqui pois já pesquisei mto sobre esse assunto. E nao consegui resolver meu problema.
segue o code
minha jsp
<h:selectOneMenu
id="classes"
value="#{provaController.classe}"
valueChangeListener="#{classeController.classeChanged}"
immediate="true" onchange="submit()" converter="model.Classe" >
<f:selectItems id="classe" value="#{classeController.listClasse}" />
<a4j:support event="onchange" reRender="cate" />
</h:selectOneMenu>
<h:message for="classes" showDetail="true" />
<h:outputLabel value="Categoria: " styleClass="campo" />
<a4j:outputPanel id="cate">
<h:outputText id="categoria" value="#{classeController.catbyClasse}" styleClass="campo"/>
</a4j:outputPanel>
<rich:spacer width="100" height="30"/>
o que quero fazer é quando eu selecionar a classe do meu produto ele mostraria a categoria desse produto. As 2 entidades são relacionadas no banco.
tenho um converter
public class ClasseConverter implements Converter {
public final static String CONVERTER_ID = "model.Classe"; //path dos beans da classe Estado
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {
try {
if (value == null || value.equalsIgnoreCase("-1")) {
return null;
}
Integer id = new Integer(value);
System.out.println("value " + value);
List<Categoria> i = new ClasseDAO().catByClasse(id);
System.out.println("i " + i.toString());
return i;
} catch (NumberFormatException ne) {
throw new ConverterException("Não foi possível converter (" + value + ") para Estado: não é um número inteiro.", ne);
} catch (IllegalArgumentException e) {
throw new ConverterException("Não foi possível converter (" + value + ") para Estado: identificador desconhecido.", e);
}
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value == null) {
return null;
}
if (value instanceof Classe) {
Classe aux = (Classe) value;
return aux.getIdclasse().toString();
} else if (value instanceof String && ((String) value).equalsIgnoreCase("-1")) {
return "-1";
} else {
throw new ConverterException("(" + value.getClass() + ") não é uma instância.");
}
}
}
meu controller
public void classeChanged(ValueChangeEvent event) {
//nunca entra aqui
Object obj = event.getNewValue();
System.out.println("cla " + obj);
clas.setIdclasse((Integer) obj);
}
//aqui que eu preencho o combobox com as classes do produto
public List<SelectItem> getListClasse() {
List<Classe> list = clDao.todasClasses();
listCla = new ArrayList<SelectItem>(list.size());
for (Classe cl : list) {
listCla.add(new SelectItem(cl, cl.getClasse()));
}
return listCla;
}
//aqui eu mostraria o nome da categoria por classe
public String getCatbyClasse() {
//aqui vem tudo null
System.out.println("idClasse " + clas.getIdclasse());
System.out.println("clas.getIdclasse() " + clas.getIdclasse());
System.out.println("cat " + clas.getCategoria());
System.out.println("c1 " + clas.getClasse());
return "ok";
}
meu DAO
public List<Categoria> catByClasse(Integer idclasse) {
System.out.println("catByClasse");
EntityManager em = getEntityManager();
try {
Query q = em.createQuery("select cat from Classe cl, Categoria cat WHERE cl.categoria.id = cat.id AND cl.idclasse = "+idclasse);
System.out.println("q " + q.getResultList());
return q.getResultList();
} finally {
em.close();
}
}
meu bean
@Override
public int hashCode() {
int hash = 0;
hash += (idclasse != null ? idclasse.hashCode() : 0);
return hash;
}
@Override
public boolean equals(Object object) {
if (this == object) {
return true;
}
if (object == null) {
return false;
}
if (!(object instanceof Classe)) {
return false;
}
Classe other = (Classe) object;
if ((this.idclasse == null && other.idclasse != null) || (this.idclasse != null && !this.idclasse.equals(other.idclasse))) {
return false;
}
return true;
}
tenho meu bean o equals e o hashcode mas ele ainda cntinua dando erro de cadastro:classes: Validation Error: Value is not valid
alguem pode me dah um help???