Pegar Texto de SelectItem - JSF

Olá pessoal, estou com uma dúvida, já vi outros exemplos dizendo q para pegar texto da SelectItem é só colocar:

<h:selectOneMenu id="combo" value="#{contatoMB.valor}">.
Assim o nome q for selecionado irá para a variavel String valor (ja criada na classe model), mas quando tento salvar no banco de dados é salvo como “null”, ou seja, não está pegando o nome selecionado, e ja conferi se passei a variavel e esta tudo certo. Dúvida como faço para pegar o nome selecionado em uma SelectItem e passar para uma variavel tipo String, e uma <h:outputText>?

O seu managed bean está mapeado como contatoMB?
Se estiver, faça um debug na sua aplicação e confira qual é o valor do atributo valor momentos antes de fazer o commit no banco de dados e diga qual foi o resultado.
Se não estiver, tenha certeza de adicionar ao arquivo de configuração do framework o mapeamento desse bean.

É através do value mesmo que você pega o valor.

caso queira enviar para um h:outputText segue o código :

<h:selectOneMenu id="selectOneMenu" value="#{seuController.objetoString}">
                      <f:selectItem itemValue="String 1" itemLabel="teste1" /> 
                      <f:selectItem itemValue="String 2" itemLabel="teste2" /> 
                      <f:ajax render=outputText "  execute="selectOneMenu" />
 </h:selectOneMenu >

<h:outputText id="outputText " value="#{seuController.objetoString}" />

[quote=chimufox]O seu managed bean está mapeado como contatoMB?
Se estiver, faça um debug na sua aplicação e confira qual é o valor do atributo valor momentos antes de fazer o commit no banco de dados e diga qual foi o resultado.
Se não estiver, tenha certeza de adicionar ao arquivo de configuração do framework o mapeamento desse bean.[/quote]
Então cara o ManagedBean ta configurado certo porq os outros parametros estao inserindo corretamente, o faces-config.xml esta mapeado corretamente, verifiquei tudo antes já, mas esta passando “null” :cry: !

[quote=ddark.emanu]É através do value mesmo que você pega o valor.

caso queira enviar para um h:outputText segue o código :

[code]
<h:selectOneMenu id=“selectOneMenu” value="#{seuController.objetoString}">
<f:selectItem itemValue=“String 1” itemLabel=“teste1” />
<f:selectItem itemValue=“String 2” itemLabel=“teste2” />
<f:ajax render=outputText " execute=“selectOneMenu” />
</h:selectOneMenu >

<h:outputText id=“outputText " value=”#{seuController.objetoString}" />

[/code][/quote]
Já tentei dessa forma mas não mostra o valor, só mostra quando o atributo é inserido manualmente!
Ainda não estou usando Ajax!
Mas obrigado pela ajuda !

se você estiver querendo pegar do banco você vai precisar de um converter no h:selectOneMenu e os selectItens vai receber valor do Controller.

<h:selectOneMenu id="grupo" value="#{controller.objeto}" converter="simpleEntityConverter">
                    <f:selectItems value="#{controller.list}"/> 
</h:selectOneMenu>

nesse artigo mostra 2 tipos de converter
http://www.rponte.com.br/tag/simpleentityconverter/

[quote=ddark.emanu]se você estiver querendo pegar do banco você vai precisar de um converter no h:selectOneMenu e os selectItens vai receber valor do Controller.

<h:selectOneMenu id="grupo" value="#{controller.objeto}" converter="simpleEntityConverter">
                    <f:selectItems value="#{controller.list}"/> 
</h:selectOneMenu>

nesse artigo mostra 2 tipos de converter
http://www.rponte.com.br/tag/simpleentityconverter/[/quote]
então ainda não sei mecher com converter como seria essa conversão? Li o tutorial mas fiquei com muitas duvidas em relação à como fazer isto!
Obrigado pela ajuda !

Você vai criar uma classe no seu projeto web que implementa Converter ,se estiver utilizando JSF 2.0 você vai usar essa anotação @FacesConverter(“nomeConverter”), seguindo o artigo eu usei o SimpleIndexConverter convertando minha lista de objetos que é recebida no meu selectOneMenu

meu codigo :

View

<h:selectOneMenu id="grupo" value="#{solicitacaoController.solicitacao.grupo}"
                                 converter="simpleEntityConverter"  style="width: 265px"
                                 required="true" requiredMessage="Campo Grupo é Obrigatório.">
                    <f:selectItem itemValue=""   itemLabel="Selecione um Grupo"/> 
                    <f:selectItems value="#{solicitacaoController.grupos}"/> 
                </h:selectOneMenu>    

converter

package util;

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("simpleEntityConverter")
public class SimpleEntityConverter 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) {   // fiz uma alteração nesse método, para poder gravar null
        
        try{
            
            SelectItem selectedItem = this.getSelectedItemByIndex(component, Integer.parseInt(value));  
            if (selectedItem != null)  
                return selectedItem.getValue();  
            
        }catch(Exception e){
            return null;
        }    
  
        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++;  
        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);  
            }  
        }  
    }  
  
}  

É interessante entender o ciclo de vida do JSF, da uma olhada nesse outro artigo

http://www.edsongoncalves.com.br/category/javaserver-faces-2-0/