JSF - selectOneMenu

Olá, estou iniciando em JSF e tenho o seguinte Erro ao tentar popular um selectOneMenu:

java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectOne(re). Found null.

Segue o código:

public List getRecursos() {
if (recursos == null) {
recursos = new ArrayList();
List entidades = DaoFactory.getDaoRecurso().listar();
for (Recurso re : entidades) {
recursos.add(new SelectItem(re.getRecursoID(), re.getRecurso()));
}
}

    return recursos;
}

Página jsp:

<h:form id=“Form”>

<h:messages globalOnly=“true” errorClass=“errorMessage” infoClass=“successMessage”/>

Recursos
            <p>
                <h:outputLabel value="Recurso:" for="recurso" />
                <h:selectOneMenu>
                    <f:selectItem itemLabel="--Selecione um --"/>
                    <f:selectItems value="#{RecursoBean.recursos}"/>
                </h:selectOneMenu>
                
            </p>

        </fieldset>
    </h:form>

Agradeço desde já caso alguém me indique a solução.

Obrigado

Acho q vc deve tentar desta forma:

<h:selectOneMenu value="#{RecursoBean.recurso}">
  <s:selectItems value="#{RecursoBean.recursos}"
                        var="recurso" label="#{recurso.txLabel}"
                        noSelectionLabel="--Selecione um --" />
    <s:convertEntity />
</h:selectOneMenu>

Onde o “value” do selectOneMenu é a variavel do tipo SelectItem q vai guardar o valor selecionado;
O “value” do selectItems é a sua lista, “var” é um alias e “label” é o rotulo a ser exibido…

Espero ter ajudado…

olá

tenta nessa linha

recursos.add(new SelectItem(re.getRecursoID(), re.getRecurso())); 

no primeiro parametro passar o objeto

recursos.add(new SelectItem(re, re.getRecurso())); 

abraço

ps: sempre que postar, coloque os códigos entre as tags [ code ] e [ /code ] sem os espaços

não esqueça de fazer o biding através do Value do elemento

Olá, Dayvison não consegui rodar seu teste, vou postar o código completo para uma visão mais ampla.

Minha entidade:

/* * To change this template, choose Tools | Templates * and open the template in the editor. */

package Entidade;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
*

  • @author kadu
    */
    @Entity
    @Table(name = “ModeloRDF”)
    public class Recurso implements Serializable{

    @Id
    @GeneratedValue
    private int recursoID;
    @Column(name = “recurso”)
    private String recurso;
    @Column(name = “propriedade_recurso”)
    private String propriedade_recurso;
    @Column(name = “valor_propriedade”)
    private String valor_propriedade;

    public Recurso(){}

    public Recurso(int recursoID, String recurso) {
    this.recursoID = recursoID;
    this.recurso = recurso;
    }

    public String getPropriedade_recurso() {
    return propriedade_recurso;
    }

    public void setPropriedade_recurso(String propriedade_recurso) {
    this.propriedade_recurso = propriedade_recurso;
    }

    public String getRecurso() {
    return recurso;
    }

    public void setRecurso(String recurso) {
    this.recurso = recurso;
    }

    public int getRecursoID() {
    return recursoID;
    }

    public void setRecursoID(int recursoID) {
    this.recursoID = recursoID;
    }

    public String getValor_propriedade() {
    return valor_propriedade;
    }

    public void setValor_propriedade(String valor_propriedade) {
    this.valor_propriedade = valor_propriedade;
    }

    @Override
    public boolean equals(Object obj) {
    if (super.equals(obj)) {
    return true;
    } else if (obj instanceof Recurso) {
    Recurso temp = (Recurso) obj;
    return temp.recursoID == this.recursoID;
    }
    return false;
    }

}

Bean :

/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package Beans;

import Entidade.Recurso;
import Persistencia.DaoFactory;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;

/**
*

  • @author kadu
    */
    public class RecursoBean implements Serializable{

    private List recursos;

    public RecursoBean(){}

    public List getRecursos() {
    if (recursos == null) {
    recursos = new ArrayList();
    List entidades = DaoFactory.getDaoRecurso().listar();
    for (Recurso re : entidades) {
    recursos.add(new SelectItem(re, re.getRecurso()));
    }
    }

     return recursos;
    

    }

}

Página JSP:

<%@page contentType="text/html" pageEncoding="UTF-8"%>

<%@taglib prefix=“f” uri=“http://java.sun.com/jsf/core”%>
<%@taglib prefix=“h” uri=“http://java.sun.com/jsf/html”%>

<f:view>

Recursos Digitais



<h:form id=“Form”>

<h:messages globalOnly=“true” errorClass=“errorMessage” infoClass=“successMessage”/>

Recursos
            <p>
                <h:outputLabel value="Recurso:" for="recurso" />
                <h:selectOneMenu value="#{Recurso.recurso}">
                    <f:selectItem itemLabel="--Selecione um --"/>
                    <f:selectItems value="#{RecursoBean.recursos}" />
                </h:selectOneMenu>
                
            </p>

        </fieldset>
    </h:form>
</body>

</f:view>

Obrigado

Desculpe Paulo, usei as tags e , não funcionou… seria entre colchetes mesmo???
obrigado

isso mesmo é colchetes

você fez o teste que eu disse?

abraço

Olá paulo, fiz o teste sim. Obtive o erro:
Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectOne(j_id_jsp_81747433_4). Found null.

Esta é minha classe:

public class RecursoBean implements Serializable{

    private List<SelectItem> recursos;

    public RecursoBean(){}

    public List<SelectItem> getRecursos() {
        if (recursos == null) {
            recursos = new ArrayList<SelectItem>();
            List<Recurso> entidades = DaoFactory.getDaoRecurso().listar();
            for (Recurso re : entidades) {
                recursos.add(new SelectItem(re, re.getRecurso()));
            }
        }

        return recursos;
    }

}

Esse é meu JSP:

<h:form id="Form">
            <fieldset>
                <div><h:messages globalOnly="true" errorClass="errorMessage" infoClass="successMessage"/></div>
                <div class="titulo">Recursos</div>

                <p>
                    <h:outputLabel value="Recurso:" for="recurso" />
                    <h:selectOneMenu value="#{Recurso.recurso}">
                        <f:selectItem itemLabel="--Selecione um --"/>
                        <f:selectItems value="#{RecursoBean.recursos}" />
                    </h:selectOneMenu>
                    
                </p>

            </fieldset>
        </h:form>

abraço

Ok

seu problema está no converter então

você sabe criar um converter?

se não souber eu te explico passo a passo com um exemplo

abraço

Paulo, criei essa classe:

public class RecursoConverter implements Converter{
	
	/**
	 * @see javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.String)
	 */
	public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String str)
			throws ConverterException {
		Recurso re;
		try {
			Integer id = new Integer( str );
			if (id == null || id == 0) {
				return null;
			}
                        re = DaoFactory.getDaoRecurso().listarPorID(id);
			
		} catch( NumberFormatException nfe ) {                
			throw new ConverterException( nfe );
		} catch (ObjectNotFoundException e) {
			throw new ConverterException("Recurso não encontrado");
		}

		return re;
	}

	/**
	 * @see javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext, javax.faces.component.UIComponent, java.lang.Object)
	 */
	public String getAsString(FacesContext facesContext,
			UIComponent uiComponent, Object obj) throws ConverterException {
		if (obj == null) {
			return null;
		} else if (obj instanceof Recurso) {
			Recurso u = ((Recurso) obj);
			return String.valueOf(u.getRecursoID());
		} else {
			return null;
		}
	}

}

No meu faces-config tenho:

 <converter>
  <converter-for-class>Entidade.Recurso</converter-for-class>
  <converter-class>java.Converter.RecursoConverter</converter-class>
 </converter>
 <managed-bean>
  <managed-bean-name>recurso</managed-bean-name>
  <managed-bean-class>Entidade.Recurso</managed-bean-class>
  <managed-bean-scope>session</managed-bean-scope>
 </managed-bean>
 <managed-bean>
  <managed-bean-name>recursoBean</managed-bean-name>
  <managed-bean-class>Beans.RecursoBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
   <property-name>recurso</property-name>
   <property-class>Entidade.Recurso</property-class>
   <value>#{recurso}</value>
  </managed-property>
 </managed-bean>
 <navigation-rule>
  <from-view-id>/welcomeJSF.jsp</from-view-id>
  <navigation-case>
   <from-outcome>sucesso</from-outcome>
   <to-view-id>/AreaCliente.jsp</to-view-id>
  </navigation-case>
  <navigation-case>
   <from-outcome>erro</from-outcome>
   <to-view-id>/WelcomeJSF.jsp</to-view-id>
  </navigation-case>
 </navigation-rule>
</faces-config>

Agora não sei como ficaria meu jsp…

obrigado…

Quando tive esse problema eu criei o converter e mapeei no faces-config assim

e no converter eu coloquei isso aqui no meu converter

public final static String CONVERTER_ID = "meuIdNoConverter"; 

deu para entender?

abraço

sim Paulo, obrigado pela força!

abraço

Se funcionar poste ai a solução completa

abraço

Uma Duvida… o SelectOneMenu retorna tipo o nome que está nele ou um iD?

pq tipo no seu exemplo vc usou um getByID…
mas qdo eu precisei disso n funciono…

Tive q criar um query pra pegar pelo nome, no caso a descrição que vai no SelectOneMenu…

[quote=colored]Uma Duvida… o SelectOneMenu retorna tipo o nome que está nele ou um iD?

pq tipo no seu exemplo vc usou um getByID…
mas qdo eu precisei disso n funciono…

Tive q criar um query pra pegar pelo nome, no caso a descrição que vai no SelectOneMenu…
[/quote]

Isso é uma dúvida, um questionamento ou um problema que você teve?

de qualquer forma, poste o seu MB que monta a lista

abraço

Todas 3…

tipo a lista eh essa.

public List<SelectItem> getListaParceiros(){
		List<Parceiro> myList = new DAOFactory().getParceiroDAO().listar();
		for(Parceiro p : myList){
			lista.add(new SelectItem(p,p.getNomeFantasia()));
		}
		return lista;
		
	}

e meu conversor eu fiz assim

public class ConverterParceiro implements Converter{

	private GenericDAO<Parceiro> dao = new DAOFactory().getParceiroDAO();

	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		Map<String, Object> parametros = new HashMap<String, Object>();
		parametros.put("nomeFantasia", value.toString());
		return dao.ObjetoPorCriterio("from Parceiro p where p.nomeFantasia = :nomeFantasia", parametros);
	}

	public String getAsString(FacesContext context, UIComponent component, Object object) {
		return ((Parceiro)object).getNomeFantasia();
	}
}

// dao.ObjetoPorCriteiro retorna um unico objeto passando uma query e os parametros..
eu fiz assim :D

você mexeu no toString da classe Parceiro?

porque no meu caso o value vinha o ID da classe e não o nome

Pois eh :X

Num mExi nao mo estranho kkkk…