Rich:combobox nao aparece o valor só o indice

12 respostas
Ginhu

Galera,

Estou com problemas para popular e capturar valores no rick:combobox, segue os fontes:

meu .xhtml:

<h:outputText value="Status:" />
         <rich:comboBox id="stMod" defaultLabel="Selecione"  value="#{modeloMB.status}">       
	<f:selectItems id="status" value="#{configuradorMB.status}"/>		
        </rich:comboBox>

meu bean:

public List<SelectItem> getStatus(){
		List<SelectItem> lista = new ArrayList<SelectItem>(); 
		
		lista.add(new SelectItem("1", "Ativo"));
		lista.add(new SelectItem("0", "Inativo"));
		
		return lista;
	}

E no combo só aparece o 1 e 0, a descrição não vem nem a pau…

valeu

12 Respostas

Michel_Sancovich

Opa, se o combo tiver apenas valores estáticos, use isto:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:rich="http://richfaces.org/rich">
      
      <rich:comboBox defaultLabel="Enter some value">
            <f:selectItem itemValue="suggestion 1"/>
            <f:selectItem itemValue="suggestion 2"/>
            <f:selectItem itemValue="suggestion 3"/>
            <f:selectItem itemValue="suggestion 4"/>
            <f:selectItem itemValue="suggestion 5"/>
      </rich:comboBox>
      
            
</ui:composition>

se não, utilize isto:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <rich:comboBox selectFirstOnUpdate="false"
        defaultLabel="Enter some value">
        <f:selectItems value="#{capitalsBean.capitalsOptions}" />
    </rich:comboBox>

</ui:composition>

e, se quiser testar também, utilize isto:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:a4j="http://richfaces.org/a4j"
    xmlns:rich="http://richfaces.org/rich">

    <rich:comboBox suggestionValues="#{capitalsBean.capitalsNames}"
        directInputSuggestions="true" defaultLabel="Enter some value" />

</ui:composition>

qualquer dúvida, acesse esse site: http://livedemo.exadel.com/richfaces-demo/richfaces/comboBox.jsf;jsessionid=2A41587D21D06F2658888BBF987DCB4D?c=comboBox&tab=usage e veja o funcionamento dos combos que mencionei.

Espero ter ajudado

t+

brunocl14

ae… da uma olhada la no site de exemplo do richfaces e da uma estudada legal. vc tem que usar ou um ou outro, mas não os dois. e depois pegar o valor no binding.

“When using selectItem(s) for suggestion definition you should define only value of the selectItem.”

http://livedemo.exadel.com/richfaces-demo/richfaces/comboBox.jsf;jsessionid=780AB0B9C9AC60DBBF3D18AA1DA8B625?c=comboBox&tab=usage

abraço;

Ginhu

Eu estou usando assim pq utilizo o mesmo combobox em vários lugares por isso to trazendo do Bean. Meu problema é que não está aparecendo a descrição, se eu utilizo o selectOneMenu do jsf, funciona…mas do richfaces não, entenderam ???

sigma

lista.add(new SelectItem("", “”));

Tipo : Pessoa p = new Pessoa();

lista.add(new SelectItem(p.getNome(), p)); //Voce vai ter que usar um Converter

Ginhu

Ah, então é o inverso ?!
Vc teria um exemplo de como pegar o “id” ?

valeu

vi-gb

Creio que no seu codigo o modeloMB.status receberia a id.

Ginhu

Então eu inverti os valores no BEAN e apareceu o “Ativo/Inativo”, mas no modeloMB.staus não aparece os códigos e sim a descrição:

meu .xhtml:

&lt;h:outputText value="Status:" /&gt;
         &lt;rich:comboBox id="stMod" defaultLabel="Selecione"  value="#{modeloMB.status}"&gt;       
	&lt;f:selectItems id="status" value="#{configuradorMB.status}"/&gt;		
        &lt;/rich:comboBox&gt;

meu bean:

public List&lt;SelectItem&gt; getStatus(){   
    List&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;();   
       
    lista.add(new SelectItem("1", "Ativo"));   
    lista.add(new SelectItem("0", "Inativo"));   
       
    return lista;   
}
public List&lt;SelectItem&gt; getStatus(){
	List&lt;SelectItem&gt; lista = new ArrayList&lt;SelectItem&gt;(); 
	
	lista.add(new SelectItem("Ativo", "1"));
	lista.add(new SelectItem("Inativo", "0"));
	
	return lista;
}
alias

Não dá pra retornar o Id.

E sim, é um PROBLEMA do componente :x

Ginhu

Putz, mano valeu…tava me matando aqui…vou usar o jsf

obrigado

gbvbahia01

O problema é na configuração do converter:

Como eu, você está utilizando o ID do banco para converte o objeto, é a melhor maneira, mas o combobox do rich faces da problema.

No lugar de utilizar o ID do objeto, utilize o nome global do objeto, mas você terá que garantir que este campo seja unico no banco, como o ID.

Basta fazer isso e seu problema resolve.

Se não puder utilizar outro campo que não seja o ID, terá que utilizar o JSF básico mesmo.
(até uma nova versão atualizada)

MarceloNeo

Bom dia galera, estou com um problema examente igual a este que o “GBVbahia01” esta comentando, mas acontece que ainda tenho uma duvida,
se fizer da forma que esta sugerindo.

Tenho que queimar processador 2 vezes com a busca no banco de dados, imagina o custo que vou ter com esta solução.
Estou usando a versão 3.3.3 mas ainda parece que tem o mesmo problema.

Alguém já falou no forum de um converter mas também parece custoso em termos de processamento e implementação,
imagina controlando isso em um grande projeto,
e até tentei implementar mas ainda não consegui.

Alguém tem aguma sugestão que contemple os pontos relacionado ao processamento.

se alguém puder dar uma dica de converter que funcione agradeço!

O erro abaixo é de uma variavel que tenho em um Bean definida como char,
E deve aparecer no combox, para o usuário como ativo, desativado que estar representado pelas letras [ f, t] explicando quando ler meu Bean deve interpretar f ou t
isso seria tranquilo em JS, mas, em rich tá dificil.

O problema acima é semelhante id! que é o principal objetivo da presente Tag

vou postar o erro ve se alguém pode dar uma boa dica.

22/04/2010 09:30:13 com.sun.facelets.FaceletViewHandler handleRenderException
SEVERE: Error Rendering View[/mod/loging/view/user.xhtml]
javax.faces.FacesException: javax.el.ELException: /mod/loging/view/user.xhtml @58,130 binding="#{users.user.active}": Cannot convert org.richfaces.component.html.HtmlComboBox@1e694e9 of type class org.richfaces.component.html.HtmlComboBox to class java.lang.Character
	at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:251)
	at com.sun.facelets.tag.jsf.ComponentHandler.createComponent(ComponentHandler.java:224)
	at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:139)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
	at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.tag.jsf.ComponentHandler.applyNextHandler(ComponentHandler.java:314)
	at com.sun.facelets.tag.jsf.ComponentHandler.apply(ComponentHandler.java:169)
	at com.sun.facelets.tag.ui.DefineHandler.apply(DefineHandler.java:58)
	at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:128)
	at com.sun.facelets.impl.DefaultFaceletContext$TemplateManager.apply(DefaultFaceletContext.java:306)
	at com.sun.facelets.impl.DefaultFaceletContext.includeDefinition(DefaultFaceletContext.java:279)
	at com.sun.facelets.tag.ui.InsertHandler.apply(InsertHandler.java:68)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
	at com.sun.facelets.tag.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:47)
	at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:248)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:294)
	at com.sun.facelets.impl.DefaultFacelet.include(DefaultFacelet.java:273)
	at com.sun.facelets.impl.DefaultFaceletContext.includeFacelet(DefaultFaceletContext.java:143)
	at com.sun.facelets.tag.ui.CompositionHandler.apply(CompositionHandler.java:113)
	at com.sun.facelets.compiler.NamespaceHandler.apply(NamespaceHandler.java:49)
	at com.sun.facelets.compiler.EncodingHandler.apply(EncodingHandler.java:25)
	at com.sun.facelets.impl.DefaultFacelet.apply(DefaultFacelet.java:95)
	at com.sun.facelets.FaceletViewHandler.buildView(FaceletViewHandler.java:503)
	at com.sun.facelets.FaceletViewHandler.renderView(FaceletViewHandler.java:546)
	at org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
	at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
	at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
	at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
	at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at sys.mod.login.SysLoginFilter.doFilter(SysLoginFilter.java:34)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.el.ELException: /mod/loging/view/user.xhtml @58,130 binding="#{users.user.active}": Cannot convert org.richfaces.component.html.HtmlComboBox@1e694e9 of type class org.richfaces.component.html.HtmlComboBox to class java.lang.Character
	at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:101)
	at com.sun.faces.application.ApplicationImpl.createComponent(ApplicationImpl.java:248)
	... 54 more
gbvbahia01

Pelo que estou vendo você está tentando converter org.richfaces.component.html.HtmlComboBox em um java.lang.Character
Você necessita de um converter não vejo outra maneira.
E acho que você não entendeu minha explicação acima também… hehehe

Não há necessidade de buscar o ID e depois buscar um texto referente aquele ID… a quantidade de viagens ao banco será a mesma:
Veja um exemplo com ID:

public class EmpresaConversor implements Converter {

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.equals("")) {
            return value;
        }
        Long id = null;
        try {
            id = new Long(value);
        } catch (NumberFormatException e) {
            FacesMessage msg = UtilMetodos.messageFactoring("empresaIdErrado", null, FacesContext.getCurrentInstance());
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
        }
        EmpresaDAO dao = new EmpresaDAO();
        Empresa e = dao.pesquisarPorId(id);
        if (e == null) {
            FacesMessage msg = UtilMetodos.messageFactoring("empresaNula", null, FacesContext.getCurrentInstance());
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            throw new ConverterException(msg);
        }
        return e;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null) {
            return null;
        }else if(value.equals("")){
            return "";
        }
        Empresa e = null;
        try {
            e = (Empresa) value;
        } catch (ClassCastException ex) {
            FacesMessage msg = UtilMetodos.messageFactoring("empresaIdErrado", null, FacesContext.getCurrentInstance());
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
        }
        return e.getId().toString();
    }
}

Mesmo Converter, só que sem ID como referencia:

public class EmpresaConversorBox implements Converter {

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || value.equals("")) {
            return value;
        }
        Empresa e = UtilPersistence.buscaEmpresaSigla(value);
        if (e == null) {
            FacesMessage msg = UtilMetodos.messageFactoring("empresaNula", null, FacesContext.getCurrentInstance());
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            throw new ConverterException(msg);
        }
        return e;
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (value == null) {
            return null;
        }else if(value.equals("")){
            return "";
        }
        if(value instanceof String){
            return value.toString();
        }
        Empresa e = null;
        try {
            e = (Empresa) value;
        } catch (ClassCastException ex) {
            //FacesMessage msg = UtilMetodos.messageFactoring("empresaIdErrado", null, FacesContext.getCurrentInstance());
            FacesMessage msg = new FacesMessage(ex.getMessage());
            msg.setSeverity(FacesMessage.SEVERITY_WARN);
            throw new ConverterException(msg);
        }
        return e.getSigla();
    }
}

No segundo exemplo tenho que garantir que Sigla seja única no banco.

DICA: No banco crie um índice sobre o que você apontar no converter…
(Neste caso Sigla)

Criado 11 de fevereiro de 2009
Ultima resposta 22 de abr. de 2010
Respostas 12
Participantes 8