Problemas <f:selectItems>

337 views
Skip to first unread message

Denis Rayan Luna da Silveira

unread,
Jun 2, 2011, 12:42:18 PM6/2/11
to jav...@googlegroups.com
Galera é o seguinte...
Estou com um problema meio estranho.

Em uma tela carrego uma Lista de Dados da Seguinte Forma...

<h:selectManyCheckbox value="#{idosoBean.idoso.tipopnes}" >
        <f:selectItems  value="#{idosoBean.listaPne2}" var="pne" itemLabel="#{pne.descricao}" itemValue="#{pne}" />
 </h:selectManyCheckbox>

Onde o usuário pode escolher vários itens...
Esta lista é doTipopne. Que tem somente o código e uma descrição que vem do Banco...
Mas quando escolho os itens que necessito e submeto o formulário...
Da um erro de conversão nesta lista...

java.lang.ClassCastException: java.lang.String cannot be cast to br.com.cci.modelo.entidade.Tipopne

Ou seja ele não está passando a entidade  e sim apenas uma cópia do endereço dela...
Como uma String...
Já tentei mudar criando um método passando o SelectItem, mas tbm deu na mesma...

O que poderia ser isto???



--
Atenciosamente,

Denis Silveira
Fone: (61) 8540-3596
www.systic.com.br
Analista Desenvolvedor Java

"É necessário sempre acreditar que o sonho é possível, que o céu é o limite..."





Filipe Aguilar Santana

unread,
Jun 2, 2011, 12:59:48 PM6/2/11
to jav...@googlegroups.com
Acho que você precisa de um conversor....

Aqui:

package converter;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItem;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.faces.model.SelectItem;
import javax.faces.model.SelectItemGroup;

@FacesConverter("converter.SimpleIndexConverter")
public class SimpleIndexConverter implements Converter {

    private int index = -1;

    /*
     * (non-Javadoc)
     *
     * @see
     * javax.faces.convert.Converter#getAsObject(javax.faces.context.FacesContext
     * , javax.faces.component.UIComponent, java.lang.String)
     */
    public Object getAsObject(FacesContext ctx, UIComponent component,
            String value) {

        SelectItem selectedItem = this.getSelectedItemByIndex(component,
                Integer.parseInt(value));
        if (selectedItem != null)
            return selectedItem.getValue();

        return null;
    }

    /*
     * (non-Javadoc)
     *
     * @see
     * javax.faces.convert.Converter#getAsString(javax.faces.context.FacesContext
     * , javax.faces.component.UIComponent, java.lang.Object)
     */
    public String getAsString(FacesContext ctx, UIComponent component,
            Object value) {
        index++;
        // changed here
        if(value==null) return "";
        else return String.valueOf(index);
    }

    /**
     * Obtem o SelecItem de acordo com a opção selecionada pelo usuário
     */
    protected SelectItem getSelectedItemByIndex(UIComponent component, int index) {

        List<SelectItem> items = this.getSelectItems(component);
        int size = items.size();

        if (index > -1 && size > index) {
            return items.get(index);
        }

        return null;
    }

    protected List<SelectItem> getSelectItems(UIComponent component) {

        List<SelectItem> items = new ArrayList<SelectItem>();

        int childCount = component.getChildCount();
        if (childCount == 0)
            return items;

        List<UIComponent> children = component.getChildren();
        for (UIComponent child : children) {
            if (child instanceof UISelectItem) {
                this.addSelectItem((UISelectItem) child, items);
            } else if (child instanceof UISelectItems) {
                this.addSelectItems((UISelectItems) child, items);
            }
        }

        return items;
    }

    protected void addSelectItem(UISelectItem uiItem, List<SelectItem> items) {

        boolean isRendered = uiItem.isRendered();
        if (!isRendered) {
            items.add(null);
            return;
        }

        Object value = uiItem.getValue();
        SelectItem item;

        if (value instanceof SelectItem) {
            item = (SelectItem) value;
        } else {
            Object itemValue = uiItem.getItemValue();
            String itemLabel = uiItem.getItemLabel();
            // JSF throws a null pointer exception for null values and labels,
            // which is a serious problem at design-time.
            item = new SelectItem(itemValue == null ? "" : itemValue,
                    itemLabel == null ? "" : itemLabel,
                    uiItem.getItemDescription(), uiItem.isItemDisabled());
        }

        items.add(item);
    }

    @SuppressWarnings("unchecked")
    protected void addSelectItems(UISelectItems uiItems, List<SelectItem> items) {

        boolean isRendered = uiItems.isRendered();
        if (!isRendered) {
            items.add(null);
            return;
        }

        Object value = uiItems.getValue();
        if (value instanceof SelectItem) {
            items.add((SelectItem) value);
        } else if (value instanceof Object[]) {
            Object[] array = (Object[]) value;
            for (int i = 0; i < array.length; i++) {
                // TODO test - this section is untested
                if (array[i] instanceof SelectItemGroup) {
                    resolveAndAddItems((SelectItemGroup) array[i], items);
                } else {
                    items.add((SelectItem) array[i]);
                }
            }
        } else if (value instanceof Collection) {
            Iterator<SelectItem> iter = ((Collection<SelectItem>) value)
                    .iterator();
            SelectItem item;
            while (iter.hasNext()) {
                item = iter.next();
                if (item instanceof SelectItemGroup) {
                    resolveAndAddItems((SelectItemGroup) item, items);
                } else {
                    items.add(item);
                }
            }
        } else if (value instanceof Map) {
            for (Map.Entry<Object, Object> entry : ((Map<Object, Object>) value)
                    .entrySet()) {
                Object label = entry.getKey();
                SelectItem item = new SelectItem(entry.getValue(),
                        label == null ? (String) null : label.toString());
                // TODO test - this section is untested
                if (item instanceof SelectItemGroup) {
                    resolveAndAddItems((SelectItemGroup) item, items);
                } else {
                    items.add(item);
                }
            }
        }
    }

    protected void resolveAndAddItems(SelectItemGroup group,
            List<SelectItem> items) {
        for (SelectItem item : group.getSelectItems()) {
            if (item instanceof SelectItemGroup) {
                resolveAndAddItems((SelectItemGroup) item, items);
            } else {
                items.add(item);
            }
        }
    }

}



Agora usa ele dessa forma:

<h:selectOneMenu id="lMunOri" value="#{criarBean.produtor.origem}">
                                        <f:converter converterId="converter.SimpleIndexConverter"/>
                                        <f:selectItem itemLabel="#{msgs.Smunicipio}"/>
                                        <f:selectItems value="#{criarBean.lMunicipiosOrigem}" />
                                    </h:selectOneMenu>


converter é o pacote que o Conversor está. Bem acho que é isso...isso acontece pq você tem uma classe Java que não é String não é mesmo?

T+,
Filipe.




--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil

Denis Rayan Luna da Silveira

unread,
Jun 2, 2011, 4:55:42 PM6/2/11
to jav...@googlegroups.com
E isso se aplica ao <h:selectManyCheckbox> tbm???
porque não consegui nem a pau.
Obrigado!

Filipe Aguilar Santana

unread,
Jun 2, 2011, 5:08:56 PM6/2/11
to jav...@googlegroups.com
Sim! Olha isso talvez te ajude...

view:

<h:selectManyCheckbox value="#{criarBean.produtor.cooperativas}" >

                   <f:converter converterId="converter.SimpleIndexConverter"/>
                  <f:selectItems value="#{criarBean.lCooperativas}" />
 </h:selectManyCheckbox>

bean:

    private Map<String, TCoop> lCooperativas = new TreeMap<String, TCoop>();
   
    public Map<String, TCoop> getlCooperativas(){
        if(this.lCooperativas.isEmpty()){
            for(TCoop coop : this.tCoopDao.loadAll())
                this.lCooperativas.put(coop.getNome(), coop);   
        }
        return this.lCooperativas;
    }

Se tiver fazendo um Tipo de objeto que criou, tem que usaro conversor.
Bom, to tentando ajudar, se alguém tiver outra dica do que pode ser....

T+,
Filipe.

Denis Rayan Luna da Silveira

unread,
Jun 3, 2011, 12:00:27 PM6/3/11
to jav...@googlegroups.com
Funcionou perfeitamente
Obrigado!

Filipe Aguilar Santana

unread,
Jun 3, 2011, 12:15:21 PM6/3/11
to jav...@googlegroups.com
De nada! :)
Reply all
Reply to author
Forward
0 new messages