Boa noite pessoal. Estou tentando utilizar combos aninhados para selecionar estado e cidade.
Abaixo segue trecho do XHTML onde esta sendo chamado os métodos:
<h:outputLabel value="Estado:"/>
<h:selectOneMenu
id="itSigufs"
value="#{empresaMB.filtroEstado}"
converter="#{estadoConverter}">
<f:selectItem itemLabel="Estados" />
<f:selectItems value="#{estadoMB.estados}"
var="i" itemValue="#{i}" itemLabel="#{i.toString()}"/>
<p:ajax process="@this" event="change" update="fmCadEmpresa:itCodcid,:growl"/>
</h:selectOneMenu>
<h:outputLabel value="Cidade:"/>
<h:selectOneMenu
id="itCodcid"
value="#{empresaMB.filtroCidade.codcid}"
converter="#{cidadeConverter}" >
<f:selectItem itemLabel="Cidades" />
<f:selectItems value="#{cidadeMB.filtrarCidadePorEstado( empresaMB.filtroEstado ) }"
var="i" itemValue="#{i}" itemLabel="#{i.nomcid}"/>
<p:ajax process="@this" event="change"/>
</h:selectOneMenu>
No meu MB tenho o seguinte:
@ManagedBean(name = "empresaMB")
@SessionScoped
public class EmpresaMB implements Serializable {
public void setSelectedEmpresa(E030emp selectedEmpresa) {
this.selectedEmpresa = selectedEmpresa;
}
private E030emp current;
private GenericDAO banco;
private boolean editando;
protected E008ufs filtroEstado;
protected E008cid filtroCidade;
public EmpresaMB() {
current = new E030emp();
banco = GenericDAO.getInstance();
editando = false;
}
private E030emp selectedEmpresa;
public E030emp getSelectedEmpresa() {
return selectedEmpresa;
}
public E008ufs getFiltroEstado() {
return filtroEstado;
}
public void setFiltroEstado(E008ufs filtroEstado) {
this.filtroEstado = filtroEstado;
}
public E008cid getFiltroCidade() {
return filtroCidade;
}
public void setFiltroCidade(E008cid filtroCidade) {
this.filtroCidade = filtroCidade;
}
Os convertes de estado e cidade:
estadoConverter
@Named(value = "estadoConverter")//Somente ManagedBeans podem utilizar injeção de dependência
@RequestScoped//Um converter não precisa ser mantido na sessão
@FacesConverter(value = "estadoConverter")
public class EstadoConverter implements Converter {
//@EJB//Para injetar um EJB, o converter deve ser um ManagedBean
//private GenericDAO banco;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
GenericDAO banco = new GenericDAO();
E008ufs objeto = (E008ufs) banco.getObjeto("SELECT C FROM E008ufs C WHERE C.sigufs = ?1", value);
return objeto;
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
try {
if (value != null && value instanceof E008ufs) {
E008ufs entity = (E008ufs) value;
return entity.getSigufs();
}
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
}
cidadeConverter
@Named(value = "cidadeConverter")//Somente ManagedBeans podem utilizar injeção de dependência
@RequestScoped//Um converter não precisa ser mantido na sessão
@FacesConverter(value = "cidadeConverter")
public class CidadeConverter implements Converter {
// @EJB//Para injetar um EJB, o converter deve ser um ManagedBean
//private GenericDAO banco;
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
try {
GenericDAO banco = new GenericDAO();
//E008ufs ufsCid = new E008ufs();
E008cid objeto = (E008cid) banco.getObjeto("SELECT C FROM E008cid C WHERE C.codcid = ?1", value);
//ufsCid.set
return objeto;
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
try {
if (value != null && value instanceof E008cid) {
E008cid entity = (E008cid) value;
return entity.getCodcid();
}
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
}
GenericDAO
import java.util.HashMap;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.FlushModeType;
import javax.persistence.NoResultException;
import javax.persistence.Persistence;
import javax.persistence.Query;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class GenericDAO {
private static GenericDAO instance = null;
private EntityManager em;
private EntityTransaction tx;
public GenericDAO() {
try {
HashMap<String, String> map = new HashMap<String, String>();
map.put("hibernate.connection.username", "postgres");
map.put("hibernate.connection.driver_class", "org.postgresql.Driver");
map.put("hibernate.connection.password", "root");
map.put("hibernate.connection.url", "jdbc:postgresql://localhost:5432/SHD2012");
// map.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
map.put("hibernate.connection.lc_ctype", "UTF8");
//map.put("hibernateshow_sql", "true");
map.put("hibernate.cache.provider_class", "org.hibernate.cache.NoCacheProvider");
EntityManagerFactory emf = Persistence.createEntityManagerFactory("SHD2012PU", map);
em = emf.createEntityManager();
em.setFlushMode(FlushModeType.AUTO);
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static GenericDAO getInstance() {
if (instance == null) {
instance = new GenericDAO();
}
return instance;
}
public <T> List<T> getList(Class clazz, String query, Object... params) {
try {
Query q = null;
q = em.createQuery(query);
if (params != null) {
int i = 1;
for (Object obj : params) {
q.setParameter(i, obj);
i++;
}
}
return q.getResultList();
} catch (Exception ex) {
ex.printStackTrace();
return null;
}
}
public Object getObjeto(String query, Object... params) {
try {
Query q = null;
q = em.createQuery(query);
if (params != null) {
int i = 1;
for (Object obj : params) {
q.setParameter(i, obj);
i++;
}
}
return q.getSingleResult();
} catch (NoResultException e) {
System.out.println("não encontrada");
return null;
} catch (Exception ex) {
System.out.println(ex.getMessage());
return null;
}
}
public boolean remove(Object obj) {
try {
em.remove(obj);
return true;
} catch (Exception ex) {
ex.printStackTrace();
return false;
}
}
public void startTransaction() {
tx = em.getTransaction();
if (tx.isActive() && tx.getRollbackOnly()) {
tx.rollback();
}
if (!tx.isActive()) {
tx.begin();
}
if (!em.getTransaction().isActive()) {
em.getTransaction().begin();
}
}
public void commit() {
// startTransaction();
if (tx != null && tx.isActive()) {
try {
tx.commit();
} catch (Exception cex) {
try {
cex.printStackTrace();
tx.rollback();
} catch (Exception rex) {
System.out.println("Erro RollBack ");
rex.printStackTrace();
}
throw new RuntimeException("Erro gravando alterações no Banco de Dados.");
}
}
}
public void delete(Object obj){
// tx = em.getTransaction();
// tx.begin();
Object merged = em.merge(obj);
em.remove(merged);
// tx.commit();
// em.close();
}
public void rollback() {
if (tx != null && tx.isActive()) {
try {
tx.rollback();
} catch (Exception rex) {
rex.printStackTrace();
}
}
}
public Object persist(Object obj) {
// startTransaction();
try {
Object novo = em.merge(obj);
obj = novo;
} catch (Exception ex) {
try {
em.persist(obj);
} catch (Exception pex) {
rollback();
pex.printStackTrace();
return null;
}
}
return obj;
}
public <T> T getEntity(Class<T> clazz, Object key) {
try {
return em.find(clazz, key);
} catch (Exception ex) {
System.out.println("Erro buscando entidade: " + ex.getMessage());
return null;
}
}
public void closeEM() {
if (em != null) {
em.close();
em = null;
instance = null;
}
}
public Object getObject(String consulta) {
try {
Object ob = null;
return em.createQuery(consulta).getSingleResult();
} catch (NoResultException no) {
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public List getObjects(String consulta, Class clazz) {
try {
Object ob = null;
return em.createNativeQuery(consulta, clazz).getResultList();
} catch (NoResultException no) {
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void refresh(Object obj) {
em.refresh(obj);
}
public void clear() {
em.clear();
}
}
Consigo selecionar o estado e, em seguida, é carregado o combo das cidades que pertencem ao estado selecionado. Porém, ao tentar salvar o registro, é chamado novamente os métodos e os valores são retornados como NULL para as variáveis filtroEstado e filtroCidade. Aparecendo a seguinte mensagem: fmCadEmpresa:itCodcid: Erro de validação: o valor não é válido.
O que pode estar acontecendo? Como resolver esta situação?