Boa tarde galera, estou enfrentando uma dorzinha de cabeça tentando implementar esse combo com ajax.
Seguem o código.
Classes modelo:
@Entity
public class Sistema implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long idSistema;
private String nomeSistema;
private String descricao;
@ManyToMany
@JoinTable(name="sistema_perfilusuario",
joinColumns = {@JoinColumn(name="idSistema")},
inverseJoinColumns = {@JoinColumn(name="idUsuario")})
private List<PerfilUsuario> usuarios;
@Entity
public class Servico implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private Long id_servico;
private String nome_servico;
private String descricao;
private String breveDesc;
@Valid
@ManyToOne
private Sistema sistemaVinculado;
Pagina html:
<h:outputLabel value="Sistema:" for="sistema" />
<h:selectOneMenu id="sistema" value="#{apropriacaoBean.sistemaId}" converter="converterSistema" >
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{listaSistemasCadastrados.sistemas}" var="e" itemValue="#{e.idSistema}" itemLabel="#{e.nomeSistema}" />
<f:ajax render="servico" event="change" listener="#{sistemaBean.listaServicos}" />
</h:selectOneMenu>
<h:outputLabel value="Servião:" for="servico" />
<h:selectOneMenu id="servico" value="#{apropriacaoBean.servicoId}" converter="converterServico" >
<f:selectItem itemLabel="Selecione" />
<f:selectItems value="#{servicoBean.cadastroServicos}" var="c" itemValue="#{c.id_servico}" itemLabel="#{c.nome_servico} - #{c.breveDesc}" />
</h:selectOneMenu>
Eu implementei também os converters:
[code]@FacesConverter(value = “converterServico”)
public class ConverterServico implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && !value.equals("")) {
DAO<Servico> dao = new DAO<Servico>(Servico.class);
return dao.buscaPorId(Long.valueOf(value));
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Servico) {
Servico servico = (Servico) value;
return String.valueOf(servico.getId_servico());
}
return "";
}
}[/code]
@FacesConverter(value = "converterSistema")
public class ConverterSistema implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value != null && !value.equals("")) {
DAO<Sistema> dao = new DAO<Sistema>(Sistema.class);
return dao.buscaPorId(Long.valueOf(value));
}
return null;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value instanceof Sistema) {
Sistema sistema = (Sistema) value;
return String.valueOf(sistema.getIdSistema());
}
return "";
}
}
Meu Bean:
public void listaServicos(AjaxBehaviorEvent event) throws ParseException {
if(apropriar != null){
servicos = getServicos(1);
}
}
public List<Servico> getServicos(long idSistema) throws ParseException{
EntityManager em = new JPAUtil().getEntityManager();
em.getTransaction().begin();
String jpql = "select s from Servico s where s.sistemaVinculado.idSistema = ?";
Query query = em.createQuery(jpql);
query.setParameter(1, idSistema);
em.close();
return query.getResultList();
}
Obs.: O que acontece é que independente quantos registros ele traga na consulta getServicos no formulário ele acaba trazendo todos que eu possuo cadastrado. Sei que fico extenso mais coloquei tudo para talvez quem possa ajuda visualize melhor o que possa estar acontecendo. Ahhhhhhh, meus converters no xhtml está com warm, caso ajude algo também. Obrigado a todos!