[RESOLVIDO] Pegar item de um componente (combobox, listbox) e usar como parametro para consulta

Olá galera, tudo bom?

Alguem já passou por isso? Tenho um converter a qual não é reconhecido… fica com um Warn na página xhtml com a seguinte mensagem: ‘converterDiretorio’ converter id is not registered.

Minha página xhtml

<h:selectOneListbox id="busca_diretorio" converter="converterDiretorio" disabled="#{consultaImagemBean.todos_diretorios || consultaImagemBean.mostra_datatable}" 
value="#{consultaImagemBean.datasetini_selecionado}" style="width:200px; height:120px">
	<f:selectItems value="#{consultaImagemBean.listadiretorio}" var="dir" itemValue="#{dir}" itemLabel="#{dir.nome_datasetini}" />
</h:selectOneListbox>

Converter

@FacesConverter(value="converterDiretorio")
public class DiretorioConverter implements Converter {

	@Override
	public Object getAsObject(FacesContext context, UIComponent component, String valor) {
		if(valor.trim().equals("")){
			return null;
		}else{
			Diretorio_inicial dir = new Diretorio_inicial(new Integer(valor));			
			return dir;
		}
	}

	@Override
	public String getAsString(FacesContext context, UIComponent component, Object valor) {
		if(valor == null){
			return null;
		}		
		Diretorio_inicial dir = (Diretorio_inicial) valor;
		return dir.getId_datasetini().toString();
	}
}

Não aparece nenhum erro quando inicio a aplicação… e renderiza normal a tela… mas nao consigo fazer uma consulta, utilizando como parametro um item pego deste listbox…
que alias, da erro… e estou tentando procurar uma solução ainda =/

22:10:05,229 INFO  [stdout] (http-localhost-127.0.0.1-9090-3) org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: astronomia.model.Diretorio_inicial

22:10:05,229 INFO  [stdout] (http-localhost-127.0.0.1-9090-3) Transaction marked as rollbackOnly

Mas vamos por partes neh… heheh
Obrigado desde já! (:

Você colocou o seu converter no faces-config.xml ?

Bom dia,

Voce precisa informar o caminho completo, por exemplo:

br.com.getadicted.converter.BlahConverter

… logo, na xhtml:

converter="br.com.getadicted.converter.BlahConverter"

O outro problema não tem nada a ver com esse.

Voce deve salvar algo antes de tentar salvar o Diretorio_inicial. Posta o código ai!

[]'s

Bom dia! (:

[quote]Você colocou o seu converter no faces-config.xml ?
[/quote]
Eu preciso por no faces-config mesmo usando annotations? JSF 2.0?

Nesse caso, eu tiro o value do Converter?

@FacesConverter(value="converterDiretorio")

o meu converter ta no package: astronomia.converter.DiretorioConverter.java
logo, no meu xhtml ficaria assim? sem o valor value…?

<h:selectOneListbox id="busca_diretorio" converter="astronomia.converter.DiretorioConverter" disabled="#{consultaImagemBean.todos_diretorios || consultaImagemBean.mostra_datatable}" value="#{consultaImagemBean.datasetini_selecionado}" style="width:200px; height:120px">
	<f:selectItems value="#{consultaImagemBean.listadiretorio}" var="dir" itemValue="#{dir}" itemLabel="#{dir.nome_datasetini}" />
</h:selectOneListbox>

Nesse modo como descrevi, continua com o warn no xhtml =/

&lt;p:selectManyMenu value="#{climaMB.listaLocalidadesSelecionadas}" id="listaLocalidadesSelecionadas" disabled="#{climaMB.tipoConsultaUniFed == 1}" style="height:100px;width:200px" converter="br.com.sisgappe.view.converter.Pontos_municipaisConverter"&gt; &lt;f:selectItems value="#{climaMB.listaLocalidades}" var="pontos_municipais" itemLabel="#{pontos_municipais.nome}" itemValue="#{pontos_municipais}" /&gt; &lt;/p:selectManyMenu&gt;

[code]package br.com.sisgappe.view.converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

import modelo.sisam.dsa.inpe.br.Pontos_municipais;

import br.com.sisgappe.model.entity.Capital;
import br.com.sisgappe.model.entity.Cidade;

@FacesConverter(“br.com.sisgappe.view.converter.Pontos_municipaisConverter”)
public class Pontos_municipaisConverter implements Converter {

@Override
public Object getAsObject(FacesContext context, UIComponent component,
		String value) {
	if (value != null && !"".equals(value.toString())) {
		Pontos_municipais pontos_municipais = new Pontos_municipais();
		String values[] = value.split(";");
		pontos_municipais.setGid(Long.parseLong(values[0]));
		pontos_municipais.setNome(values[1]);
		return pontos_municipais;
	} else {
		return null;
	}
}

@Override
public String getAsString(FacesContext context, UIComponent component,
		Object value) {
	Pontos_municipais pontos_municipais = (Pontos_municipais) value;
	StringBuffer sb = new StringBuffer();
	sb.append(pontos_municipais.getGid());
	sb.append(";");
	sb.append(pontos_municipais.getNome());
	return sb.toString();
}

}
[/code]
[]'s

acabei de descobrir uma coisa… estou usando o componente h:selectOneListbox, mas se uso o do primefaces p:selectOneListbox, ae reconhece! :open_mouth:
sabem me dizer pq, ou como fzer pra usar html basico? nao queria usar o do prime pq, não sei oq acontece, acho q é pq troquei o theme dele, mas com o do primefaces, eu nao consigo selecionar algum item, ou melhor, quando seleciono, nao aparece (fica marcado com outra cor) o item q selecionei…

[quote]
O outro problema não tem nada a ver com esse.

Voce deve salvar algo antes de tentar salvar o Diretorio_inicial. Posta o código ai![/quote]

Mas eu não estou salvando amigo… só quero fazer uma consulta no banco, pegando como parametro um item do listbox…
qual parte do código gostaria que eu colocasse?

Obrigado pela atenção! (:

[quote=pcsantana]acabei de descobrir uma coisa… estou usando o componente h:selectOneListbox, mas se uso o do primefaces p:selectOneListbox, ae reconhece! :open_mouth:
sabem me dizer pq, ou como fzer pra usar html basico? nao queria usar o do prime pq, não sei oq acontece, acho q é pq troquei o theme dele, mas com o do primefaces, eu nao consigo selecionar algum item, ou melhor, quando seleciono, nao aparece (fica marcado com outra cor) o item q selecionei…

[quote]
O outro problema não tem nada a ver com esse.

Voce deve salvar algo antes de tentar salvar o Diretorio_inicial. Posta o código ai![/quote]

Mas eu não estou salvando amigo… só quero fazer uma consulta no banco, pegando como parametro um item do listbox…
qual parte do código gostaria que eu colocasse?

Obrigado pela atenção! (:[/quote]

No meu os warnins tambem ficam, mas funciona! Tenta mudar de ListBox para OneMenu, olha o mapeamento direitinho ai.

[]'s

hummm…
getAdicted, vc poderia me ajudar a ver se esta certo o meu mapeamento?
oh…

@Entity
@Table(name="dataset_inicial")
public class Diretorio_inicial implements Serializable {
	private static final long serialVersionUID = 2241074338047608003L;

	@Id
	@SequenceGenerator(name="dataini", sequenceName="dataset_inicial_id_datasetini_seq",allocationSize=1)
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="dataini")
	@Column(name="id_datasetini", unique=true, nullable=false)
	private Integer id_datasetini;
	
	@Column(name="nome_datasetini", unique=true)
	private String nome_datasetini;

	@OneToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL, mappedBy = "dataset_ini")
	private List<Imagem_inicial> imagem_ini = new ArrayList<Imagem_inicial>();
	//GETTERS E SETTERS
@Entity
@Table(name="imagem_inicial")
public class Imagem_inicial implements Serializable {
	private static final long serialVersionUID = 6620894928054638720L;
	
	@Id
	@SequenceGenerator(name="imageini", sequenceName="imagem_inicial_id_imageini_seq",allocationSize=1)
	@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="imageini")
	@Column(name="id_imageini", unique=true, nullable=false)
	private Integer idImageini;
	
	@Column(name="caminho")
	private String caminho;

	@Column(name="nome_imagem")
	private String nome_imagem;
	
	@ManyToOne(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
	@JoinColumn(name = "id_datasetini")
	private Diretorio_inicial dataset_ini;
	//GETTERS E SETTERS

O que eu quero, é listar todos os diretorios no listbox (ou SelectOneMenu), e fazer uma consulta das imagens que tem no diretorio selecionado…

Coloca todo o código, onde voce esta chamando o listar do DAO, etc…

[]'s

ok, obrigado :smiley:

Aqui ta o meu Bean

@ManagedBean
@ViewScoped
public class ConsultaImagemBean {
	
	private Imagem_inicial imagem_selecionado;
	private Diretorio_inicial datasetini_selecionado;
	private List<Imagem_inicial> lista;
	private ImagemDAO imagemDAO = new ImagemDAO();;
	private DiretorioDAO diretorioDAO = new DiretorioDAO();
	private boolean todos_diretorios = false;
	private List<Diretorio_inicial> listadiretorio;
	
	public void Pesquisar(){
		try {
			if (todos_diretorios == true){	
				listarTodasImagens();
			} else {
				imagemDAO.beginTransaction();
				lista = imagemDAO.procuraImagem(getDatasetini_selecionado());
				imagemDAO.commitAndCloseTransaction();
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}
	
	public void listarTodasImagens(){
		imagemDAO.beginTransaction();
		lista = imagemDAO.findAll();
		imagemDAO.commitAndCloseTransaction();	
	}
	
	public void listarTodosDiretorios(){
		diretorioDAO.beginTransaction();
		listadiretorio = diretorioDAO.findAll();
		diretorioDAO.commitAndCloseTransaction();
	}
	
	public List<Diretorio_inicial> getListadiretorio() {
		if(listadiretorio == null){
			listarTodosDiretorios();
		}
		return listadiretorio;
	}
	public void setListadiretorio(List<Diretorio_inicial> listadiretorio) {
		this.listadiretorio = listadiretorio;
	}
		
	//OUTROS GETTERS E SETTERS
}

o metodo do meu ImagemDAO

	@SuppressWarnings("unchecked")
	public List<Imagem_inicial> procuraImagem(Diretorio_inicial dir){
		List<Imagem_inicial> lista1 = null;
		try {
			Query query = em.createQuery("select im from Imagem_inicial im where im.dataset_ini in (:dataset_ini)");
			query.setParameter("dataset_ini", dir);
			lista1 = query.getResultList();
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		return lista1;
	}

Parece estar ok! Se certifique de que o valor do combo esta sendo passado para o metodo que faz a pesquisa.

[]'s

Obrigado pela ajuda getAdicted :smiley:

mas realmente to apanhando faz tempo ja pra conseguir fazer isso… rodando o debug, parece que o getDatasetini_selecionado() chega nulo…
e aparece aquele erro no console q te mostrei…

vc conhece algum tutorial ou material que mostre um exemplo parecido com isso que eu estou tentando fazer??
Só encontro exemplos de CRUD, nenhum exemplo de consulta em banco com parametros e tals… =/

;s

Tranquilo,

Leia essa apostila que voce vai ficar craque, inclusive, tem um exemplo muito parecido com a solução para o seu problema. Bons estudos.

[]'s

Obrigado amigoo!! vou dar uma estudada sim! :smiley:

Valeeu, qualquer novidade eu posto aqui!

Abraços!

Se alguém me puder tirar uma dúvida…
no meu relacionamento de 1:N, no banco de dados é criado uma FK do tipo Integer na tabela Imagem, que é a id (PK) da tabela Diretorio.

Nesse caso, na minha consulta, eu não deveria pegar a id como parametro, ao invés do objeto como um todo?

Em todo caso, é que ao rodar o debugg eu vejo que não consigo pegar o que foi selecionado no meu listbox (ja tentei com selectonemenu tbm)… =/

Visão: &lt;h:selectOneMenu value="#{professorBean.idEstadoCivil}" id="estado_civil"&gt; &lt;f:selectItem itemLabel="SELECIONE" itemValue="0" /&gt; &lt;f:selectItems value="#{professorBean.selectItensEstadosCivis}" var="estadoCivil" itemLabel="#{estadoCivil.descEstadoCivil}" itemValue="#{estadoCivil.idestadoCivil}" /&gt; &lt;f:validator validatorId="br.com.pirralhos.view.validation.ComboValidator" /&gt; &lt;p:message for="estado_civil" /&gt; &lt;/h:selectOneMenu&gt;
Controle:[code]@ViewScoped
@ManagedBean(name = “professorBean”)
public class ProfessorBean implements Serializable {
private Integer idEstadoCivil;
private Professor professor;

public Integer getIdEstadoCivil() {
return idEstadoCivil;
}

    public void setIdEstadoCivil(Integer idEstadoCivil) {
            this.idEstadoCivil = idEstadoCivil;
    }
   
   public String gravar() {
   professor.setFkEstadoCivl(new EstadoCivil(getIdEstadoCivil()));
   getProfessorDAO().save(getProfessor());
   }

[/code]
Modelo:[code]@Entity
@Table(name = “professor”)
public class Professor implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = “idprofessor”)
private Integer idprofessor;
@Basic(optional = false)
@Column(name = “bairro”)
private String bairro;
@JoinColumn(name = “fk_estado_civl”, referencedColumnName = “idestado_civil”)
@ManyToOne(optional = false)
private EstadoCivil fkEstadoCivl;
public Professor() {
}

public Professor(Integer idprofessor) {
    this.idprofessor = idprofessor;
}
[/code]
[code]@Entity
@Table(name = "estado_civil")
public class EstadoCivil implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "idestado_civil")
private Integer idestadoCivil;
  @OneToMany(cascade = CascadeType.ALL, mappedBy = "fkEstadoCivl")
private List&lt;Professor&gt; professorList;
 public EstadoCivil(Integer idestadoCivil) {
    this.idestadoCivil = idestadoCivil;
}
public Integer getIdestadoCivil() {
    return idestadoCivil;
}

public void setIdestadoCivil(Integer idestadoCivil) {
    this.idestadoCivil = idestadoCivil;
}
public List&lt;Professor&gt; getProfessorList() {
    return professorList;
}

public void setProfessorList(List&lt;Professor&gt; professorList) {
    this.professorList = professorList;
}
}
[/code]

Validação:[code]package br.com.pirralhos.view.validation;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

@FacesValidator(“br.com.pirralhos.view.validation.ComboValidator”)
public class ComboValidator implements Validator {

    @Override
    public void validate(FacesContext arg0, UIComponent arg1, Object value)
                    throws ValidatorException {
            if (value == null || value.toString().equals("0")) {
                    FacesMessage msg = new FacesMessage("Campo " + arg1.getId()
                                    + " é obrigatório!", "Selecione um valor para o campo "
                                    + arg1.getId());
                    msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                    throw new ValidatorException(msg);

            }

    }

}[/code]

Veja os trechos e poste as duvidas aqui.

[]'s

Obrigado pela ajuda amigo…
voce poderia postar a parte do código onde ele esta listando no combobox?

<f:selectItems value="#{professorBean.selectItensEstadosCivis}"

outra coisa… no seu método

public String gravar() {  
       professor.setFkEstadoCivl(new EstadoCivil(getIdEstadoCivil()));  
       getProfessorDAO().save(getProfessor());  
}  

professor.setFkEstadoCivl(new EstadoCivil(getIdEstadoCivil())); ele seta para o atributo fkEstadoCivl o Integer idEstadoCivil que pegou no componente? Para assim saber qual estado civil é para salvar? seria isso?
No meu caso, como quero fazer uma consulta, eu faria isso ae antes de chamar ou metodo para pesquisa… algo assim?

imagemDAO.beginTransaction();
imagem_selecionado.setDataset_ini(new Diretorio_inicial(getIdDiretorio()));
lista = imagemDAO.procuraImagem(getDatasetini_selecionado());
imagemDAO.commitAndCloseTransaction();

E para que serve a opção optional=false no mapeamento? @ManyToOne(optional = false)
Obrigado mais uma vez!!

[code]import java.util.ArrayList;
import java.util.List;

import javax.faces.FacesException;
import javax.faces.model.SelectItem;
import javax.management.RuntimeErrorException;

public class SelectItemUtils {
private static final String GET=“get”;

    public static &lt;T&gt; List&lt;SelectItem&gt; getSelectItems(String keyFieldName, String labelFieldName,List&lt;T&gt; objects)
    {
            keyFieldName = keyFieldName.substring(0,1).toUpperCase().concat(keyFieldName.substring(1));
            labelFieldName = labelFieldName.substring(0,1).toUpperCase().concat(labelFieldName.substring(1));
            List&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;();
            for(T object : objects)
            {
                    try
                    {
                            String label = object.getClass().getMethod(GET.concat(labelFieldName), null).invoke(object,null ).toString();
                            Object key = object.getClass().getMethod(GET.concat(keyFieldName), null).invoke(object,null ).toString();
                            lista.add(new SelectItem(key,label));
                    }
                    catch (Exception e) {
                            throw new FacesException(e.getMessage());
                    }
            }
            return lista;
    }

}[/code]

[quote]professor.setFkEstadoCivl(new EstadoCivil(getIdEstadoCivil())); ele seta para o atributo fkEstadoCivl o Integer idEstadoCivil que pegou no componente? Para assim saber qual estado civil é para salvar? seria isso?
No meu caso, como quero fazer uma consulta, eu faria isso ae antes de chamar ou metodo para pesquisa… algo assim? [/quote]
Sim.

A proriedade optional indica se ele deve ser null ou não, a nivel de banco.

[]'s

Amigo, agradeço muito mesmo a ajuda que está me dando… mas sou novo ainda nisso, e algumas coisas ficam meio confusas pra mim…

esse modo que me mostrou de pegar o item selecionado, só da certo com SelectItem? Eu estava tentando fazendo de um modo mais simples, que era simplesmente retornar uma lista de objetos pegos no banco…

no método

public static <T> List<SelectItem> getSelectItems(String keyFieldName, String labelFieldName,List<T> objects) 

como e o que voce passa paraaas variáveis: String keyFieldName, String labelFieldName,List objects ??

Obrigado pela ajuda e paciencia!

Bom dia,

Um amigo meu quem implementou dessa forma mais elegante (ou pegou pronto). Voce pode jogar a lista direto, assim:

[code]private List<Estados> listaEstados;
private Estado estado;
private Pais pais;
public Estados getEstados() {
return estados;
}

public void setEstados(Estados estados) {
	this.estados = estados;
}
    public Estados getEstados() {
	return estados;
}

public void setEstados(Estados estados) {
	this.estados = estados;
}
    public Estado getEstado() {
	return estado;
}

public void setEstado(Estado estado) {
	this.estado = estado;
}
    public void setPais(Estado pais) {
	this.pais= pais;
}
    public Pais getPais() {
	return pais;
}
    }[/code]
    		[code]&lt;p:selectOneMenu value="#{climaMB.estado}"&gt;
						&lt;f:selectItems value="#{climaMB.listaEstados}" var="estados"
							itemLabel="#{estados.nome}" itemValue="#{estados}" /&gt;
					&lt;/p:selectOneMenu&gt;[/code]

public class Cadastrar{ public void gravar(){ setPais(estado); dao.gravar(pais); }
[]'s