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

21 respostas
P

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á! (:

21 Respostas

L

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

G

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

P

Bom dia! (:

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

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 =/

G
&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;
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();
	}

}
[]'s
P

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…


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!

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! (:

G

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…


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!

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! (:

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

[]'s

P

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…

G

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

[]'s

P

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;
	}
G

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

[]'s

P

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

G

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

P

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

Valeeu, qualquer novidade eu posto aqui!

Abraços!

P

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)… =/

G
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:
@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());
       }
Modelo:
@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;
    }
@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;
    }
    }
Validação:
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);

                }

        }

}

Veja os trechos e poste as duvidas aqui.

[]'s

P

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!!

G
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;
        }
        
}
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?
Sim.

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

[]'s

P

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!

G

Bom dia,

Um amigo meu quem implementou dessa forma mais elegante (ou pegou pronto). Voce pode jogar a lista direto, assim:
private List&lt;Estados&gt; 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;
	}
        }
&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;
public class Cadastrar{
         public void gravar(){
         setPais(estado);
         dao.gravar(pais);
         }
[]'s
P

getAdicted, primeiramente quero te agradecer pela força e apoio!! Valeu mesmo :smiley:

Depois de mto apanhar, hoje consegui encontrar um jeito que funcionou… vou postar aqui o que deu certo pra mim… Detalhe, o melhor de tudo que sem usar um Converter! :smiley:
lembrando que no meu caso, eu queria fazer uma busca…

xhtml (ta com Listbox, mas funciona com SelectOneMenu tbm)

<h:selectOneListbox id="busca_diretorio" value="#{consultaImagemBean.idDiretorio}" immediate="false">
	<f:selectItem itemLabel="Selecione" itemValue="" /> 
	<f:selectItems value="#{consultaImagemBean.listadiretorio}" var="data" itemValue="#{data.id_datasetini}" itemLabel="#{data.nome_datasetini}"/>
	<f:ajax event="change" render="busca_diretorio" />   //acredito que o segredo foi aqui
</h:selectOneListbox>

Bean (o restante do código tem nos post anteriores, vo por só o que realmente importa na solução do problema)

private Integer idDiretorio;
//getter e setter do idDiretorio

//Metodo Pesquisar
imagemDAO.beginTransaction();
diretorioDAO.beginTransaction();
Diretorio_inicial dir = diretorioDAO.find(getIdDiretorio());  //procura o Diretorio desejado pelo Integer pego no componente
lista = imagemDAO.procuraImagem(dir);  //passa como parametro o objeto recuperado através da busca acima, para o método procuraImagem()
imagemDAO.commitAndCloseTransaction();

Qualquer coisa só pedirem…

e mais uma vez Obrigado!!! :smiley:

G

Prazer, amigo! Sucesso.

[]'s

Criado 11 de agosto de 2012
Ultima resposta 21 de ago. de 2012
Respostas 21
Participantes 3