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
meuIdNoConverter
converter.EstadoConverter
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
colored
Outubro 13, 2009, 3:37pm
#13
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
colored
Outubro 13, 2009, 4:51pm
#15
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
colored
Outubro 15, 2009, 4:21pm
#17
Pois eh :X
Num mExi nao mo estranho kkkk…