JSF SelectMany tag

1 resposta
L

Pessoal, boa noite.

Deve ser algo bastante besta e fácil pra maioria, mas nunca usei JSF e tou apanhando bastante.
Fiz um search nos tópicos de Java pra Web e não encontrei nada.

Estou fazendo uma página em JSF bem boqueta, fazendo uso do selectmany.

Vou colocar o código do meu backing bean (anotado como "Controller") e do próprio jsp.

<h:column>
                    <h:outputText value="Vendedores:"/>

                    <h:selectManyMenu
                        id="vendedores"
                        value="#{viewSeparacaoSinteticoRelatorioController.vendedorChoices}">
                        <f:selectItems
                            value="#{viewSeparacaoSinteticoRelatorioController.vendedorSelects}"/>
                    </h:selectManyMenu>


               </h:column>

Agora o código da classe

package controller;

import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.faces.model.SelectItem;
import org.springframework.stereotype.Controller;
import org.springframework.context.annotation.Scope;
import service.ViewSeparacaoSinteticoRelatorioService;

@Controller("viewSeparacaoSinteticoRelatorioController")
@Scope("session")
public class ViewSeparacaoSinteticoRelatorioController {

    @Resource
    private ViewSeparacaoSinteticoRelatorioService vssrs;

    public ViewSeparacaoSinteticoRelatorioService getVssrs() {
        return vssrs;
    }

    public void setVssrs(ViewSeparacaoSinteticoRelatorioService vssrs) {
        this.vssrs = vssrs;
    }
    private List vendedorChoices = new ArrayList();

    public List getVendedorChoices() {
        return vendedorChoices;
    }

    public void setVendedorChoices(List vendedorChoices) {
        this.vendedorChoices = vendedorChoices;
    }
    private SelectItem[] vendedorSelects;

    public SelectItem[] getVendedorSelects() {
        return vendedorSelects;
    }

    public void setVendedorSelects(SelectItem[] vendedorSelects) {
        this.vendedorSelects = vendedorSelects;
    }

    public ViewSeparacaoSinteticoRelatorioController() {


        this.fillSelectItemsVendedor();


    }
    private String formatoChoice;
    private Object formatoValue;

    public String getFormatoChoice() {
        return formatoChoice;
    }

    public void setFormatoChoice(String formatoChoice) {
        this.formatoChoice = formatoChoice;
    }

    public Object getFormatoValue() {
        return formatoValue;
    }

    public void setFormatoValue(String formatoValue) {
        this.formatoValue = formatoValue;
    }

    private void fillSelectItemsVendedor() {
        List lista;
        if (vssrs != null) {
            lista = vssrs.listarVendedores();
            this.vendedorSelects = new SelectItem[lista.size()];
            SelectItem si = new SelectItem();
            int i = 0;
            for (Object o : lista) {
                si.setLabel(o.toString());
                si.setValue(o);
                vendedorSelects[i] = si;
                i++;
            }
        }

    }

    public void gerarRelatorio() {


        vssrs.gerarRelatorio(formatoValue.toString());

    }
}

A exceção que obtenho:

java.lang.IllegalArgumentException: Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectMany(vendedores). Found null.
com.sun.faces.renderkit.RenderKitUtils.getSelectItems(RenderKitUtils.java:357)
com.sun.faces.renderkit.html_basic.MenuRenderer.getOptionNumber(MenuRenderer.java:675)
com.sun.faces.renderkit.html_basic.MenuRenderer.renderSelect(MenuRenderer.java:793)
com.sun.faces.renderkit.html_basic.MenuRenderer.encodeEnd(MenuRenderer.java:335)
javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:836)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:896)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
javax.faces.render.Renderer.encodeChildren(Renderer.java:137)
javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:812)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:886)
javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:245)
com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:176)
org.ajax4jsf.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:100)
org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:176)
com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:368)
org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:495)
org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)

Alguém pode dar uma mão por gentileza?

[]'s

1 Resposta

Grinvon

O problema é que você está tentando preencher com uma Lista “normal”, para preencher lista (combos, listas, etc no JSF) você precisa criar uma lista de SelectItem em outras palavras, pegue sua lista de uma entidade e criei outra lista de instância de SelectItem, popule ela passando como parâmetro um identificador e a sua descrição.

Provavelmente você irá precisar criar um converter para tipos não comuns.

Criado 19 de julho de 2009
Ultima resposta 19 de jul. de 2009
Respostas 1
Participantes 2