JSF + SelectOneRadio não funciona

Boa tarde caros amigos e amigas do GUJ…
Existe algum problema no código abaixo?

		<h:selectOneRadio id="sonSIE" value="#{ProtocoloBean.protocolo.flgSie}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:selectItem  itemLabel="Sim" itemValue="S"/>
				<f:selectItem  itemLabel="Não" itemValue="N"/>
		</h:selectOneRadio>

Apenas o N fica checked, na minha tela eu mudo o valor da seleção mas qdo vejo no MBean, só aparece o N.
ProtocoloBean.protocolo.flgSie é um campo String.

Obrigado pela atenção de todo(a)s…

cara,

crie uma classe converter e atribua a seu componente.

t+

Não creio que seja problema de Converter, afinal, ele está enviando uma String. O converter é necessário quando se tem um objeto sendo selecionado.

Todos os outros valores do formulário estão sendo persistidos normalmente?

Existe um outro campo de texto que estah passando como vazio… vou postar um pouco mais de código… na verdade tenho um formulário dentro de outro…

Segue todo o código da view:

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	xmlns:mj="http://mojarra.dev.java.net/mojarra_ext"
	xmlns:c="http://java.sun.com/jsp/jstl/core">


<h:body>
	<h:form id="formProcessamento" prependId="false">
		<h:panelGrid id="pnDescr" columns="2">
			<h:outputLabel id="olDescAtenDinfa" value="Atendimento:" />
			<h:outputLabel id="otAreaDadosAltNaDinfa"
				value="#{ProtocoloBean.value}" escape="false" />
		</h:panelGrid>
		<h:outputLabel id="olDadAltDinfa" value="Dados Alterados:" />
		<h:outputLabel id="otDadosAltNaDinfa" />

		<p:separator style="width: 100%; height: 5px" />
		<br />
		<h:outputLabel id="olAtualInfo"
			value="As informações foram atualizas nos sistemas:" />
		<h:panelGrid columns="2" cellpadding="10">
			<h:outputLabel value="  " />
			<h:outputLabel value="  " />
			<h:outputLabel value="  " />
			<h:outputLabel value="  " />
			<h:outputLabel id="olPastAluno" value="Pasta do Aluno:" />
			<h:selectOneRadio id="sonPastAluno" value="#{ProtocoloBean.protocolo.flgPastaAluno}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:selectItem  itemLabel="Sim" itemValue="S" />
				<f:selectItem  itemLabel="Não" itemValue="N" />
			</h:selectOneRadio>

			<h:outputLabel id="olSIE" value="SIE:" />
			<h:selectOneRadio id="sonSIE" value="#{ProtocoloBean.protocolo.flgSie}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:selectItem  itemLabel="Sim" itemValue="S"/>
				<f:selectItem  itemLabel="Não" itemValue="N"/>
			</h:selectOneRadio>

			<h:outputLabel id="olGED" value="GED:" />
			<h:selectOneRadio id="sonGED" value="#{ProtocoloBean.protocolo.flgGed}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:selectItem  itemLabel="Sim" itemValue="S"/>
				<f:selectItem  itemLabel="Não" itemValue="N"/>
			</h:selectOneRadio>
		</h:panelGrid>
		<br />
		<p:separator style="width: 100%; height: 5px" />
		<br />
		<h:outputLabel id="olDescricaoAtendimento2"
			value="DESCRIÇÃO DO ATENDIMENTO:" for="itaDescricaoAtendimento2"
			onfocus="true" />

		<p:editor id="itaDescricaoAtendimento2" widgetVar="editor" width="700"
			 height="200" value="#{ProtocoloBean.value}" disabled="#{ProtocoloBean.disabled_1}"/>

		<h:panelGrid id="pgridArq" columns="1" style="margin-top:10px">
			<p:commandButton id="cbLimparEdit" type="button" value="Clear"
				onclick="editor.clear()" image="ui-icon ui-icon-close" disabled="#{ ProtocoloBean.disabled_1  }"/>
		</h:panelGrid>
	</h:form>
</h:body>
</html>

Abaixo mostro onde está sendo incluida, utilizo Facelet’s:

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:p="http://primefaces.prime.com.tr/ui"
	xmlns:mj="http://mojarra.dev.java.net/mojarra_ext"
	xmlns:c="http://java.sun.com/jsp/jstl/core" >
	

<h:body>
	<div id="formProtocolo">
		<h:form prependId="false">
			<p:growl id="msg" showDetail="true"/>
			<p:toolbar>
				<p:toolbarGroup align="left"> 
				
					<p:commandButton id="btnNovo" 
									 type="push" 
									 value="Novo Protocolo" 
									 image="ui-icon-document" 
									 action="#{ProtocoloBean.redirectTipoSolicitacao}" />
					<p:divider />
					
					<p:commandButton id="btnSalvar" 
									 type="push" 
									 image="ui-icon-disk" 
									 update="msg menuDireito tabProtocolosUnid tabProtocolosFuncionario" 
									 actionListener="#{ProtocoloBean.salvaProtocolo}" 
									 disabled="#{ProtocoloBean.disable_btns}"/> 
					
					<p:commandButton type="push" 
									 title="Print" 
									 image="ui-icon-print" 
									 disabled="#{ProtocoloBean.disable_btns}"/>
					
					<p:commandButton id="btnCancelar" 
									 onclick="dlg.show()" 
									 type="push" 
									 title="Cancelar" 
									 image="ui-icon-close" 
									 update="msg menuDireito tabProtocolosUnid tabProtocolosFuncionario" 
									 disabled="#{ProtocoloBean.disable_btns}"/>
					
					<p:commandButton id="btnFinalizar" 
									 type="push" 
									 title="Finalizar" 
									 image="ui-icon-arrowreturnthick-1-s" 
									 update="msg menuDireito tabProtocolosUnid tabProtocolosFuncionario" 
									 actionListener="#{ProtocoloBean.finalizaProtocolo}" 
									 disabled="#{ProtocoloBean.ctrlFinalizar}"/>
					
					<p:commandButton type="push" 
					                 title="Ajuda" 
					                 image="ui-icon-help" />
					
					<h:selectManyCheckbox id="selectPrt" 
					                      rendered="#{ (not ProtocoloBean.isNewProtocol) 
					                                   and (ProtocoloBean.protocolo.statusProtocolo.idStatusProtocolo !=2 ) 
					                                   and (ProtocoloBean.protocolo.statusProtocolo.idStatusProtocolo !=3 )
					                                   and (ProtocoloBean.protocolo.statusProtocolo.idStatusProtocolo !=5 ) }" >
					 	<f:selectItem id="selProtocolForMe" itemValue="0" itemLabel="Selecionar Protocolo" />
					 	<p:ajax update="selProtocolForMe tabProcessamento msg" listener="#{ProtocoloBean.direcionarProtocolo}" oncomplete="selectPrt.disabled = true;"/>
					</h:selectManyCheckbox>
					
				</p:toolbarGroup>

				<p:divider />

				<p:toolbarGroup align="right">
					<h:selectOneMenu id="somAcaoProt" 
					                 value="#{ProtocoloBean.acao}" 
									 disabled="#{(ProtocoloBean.disable_actions) || ((empty ProtocoloBean.fluxosDestino1) and (ProtocoloBean.acao == 1))}">
						<f:selectItem itemValue="0" itemLabel="Encaminhar" />
						<f:selectItem itemValue="1" itemLabel="Devolver" />
						<p:ajax update="slcEncaminhar" listener="#{ProtocoloBean.preencheDestinosProtocolo}"/>
					</h:selectOneMenu>
					
					<h:selectOneMenu id="slcEncaminhar" 
					                 value="#{ProtocoloBean.fluxo.id.idFluxo}" 
					                 disabled="#{(ProtocoloBean.disable_actions) || ((empty ProtocoloBean.fluxosDestino1) and (ProtocoloBean.acao == 1) )}" 
					                 required="true"
					                 requiredMessage="Escolha um destino!"
					                 update="menuDireito tabProtocolosUnid tabProtocolosFuncionario">
					    <f:selectItem itemValue="0" itemLabel="Selecione" />
					    <f:selectItems id="selEncaminhar"
							           value="#{ProtocoloBean.fluxosDestino1}"
							           var="f" 
							           itemLabel="#{f.nmSglUnidDestino}"
							           itemValue="#{f.id.idFluxo}"/>
					</h:selectOneMenu>

					
					<p:commandButton id="btnTramitar" 
					                 type="push" 
					                 title="Tramitar"  
					                 onclick="if ( somAcaoProt.value == 1 )dlg2.show(); " 
					                 image="ui-icon ui-icon-arrowreturnthick-1-e" 
					                 actionListener="#{ProtocoloBean.tramitar}" 
					                 update="msg menuDireito tabProtocolosUnid tabProtocolosFuncionario" 
					                 disabled="#{ProtocoloBean.disable_btns}"/>
					

				</p:toolbarGroup>
			</p:toolbar>

			..........................................

				<p:tab title="PROCESSAMENTO" id="tabProcessamento">
					<ui:include src="/section/operation/processamento.xhtml" />
				</p:tab>

			.......................	
			</p:tabView>
		</h:form>
		
		       
	</div>
</h:body>
</html>

O campo ProtocoloBean.value estah chegando vazio no MBean…

cara,

so usar o converter que vai funcionar.

t+

[quote=alissonvla]cara,

so usar o converter que vai funcionar.

t+[/quote]

Mano, converter só é utilizado para objetos. O objeto da combo é uma String, o JSF toma conta disso sozinho.

faz um teste ai ve se funciona, pois nos meu projetos tive que fazer isso para funcionar.

t+

Usei um converter aqui mas não passou…

....

<h:selectOneRadio id="sonSIE" value="#{ProtocoloBean.protocolo.flgSie}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:selectItem  itemLabel="Sim" itemValue="S">
					<f:converter converterId="indexConverter"/>
				</f:selectItem>
				<f:selectItem  itemLabel="Não" itemValue="N">
					<f:converter converterId="indexConverter"/>
				</f:selectItem>
</h:selectOneRadio>

....

Código do converter:

package br.com.ufu.prograd.siprot.converters;

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.model.SelectItem;
import javax.faces.model.SelectItemGroup;

public class SimpleIndexConverter implements Converter {  
  
    private int index = -1;  
  
    
    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;  
    }  
  
     
    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);  
            }  
        }  
    }  
  
} 

ERRO:

javax.faces.view.facelets.TagException: /section/operation/processamento.xhtml @32,48 <f:converter> Parent not an instance of ValueHolder: javax.faces.component.UISelectItem@69d4c4b7
at com.sun.faces.facelets.tag.jsf.ConverterTagHandlerDelegateImpl.apply(ConverterTagHandlerDelegateImpl.java:84)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)
at javax.faces.view.facelets.DelegatingMetaTagHandler.apply(DelegatingMetaTagHandler.java:114)
at javax.faces.view.facelets.CompositeFaceletHandler.apply(CompositeFaceletHandler.java:94)
at javax.faces.view.facelets.DelegatingMetaTagHandler.applyNextHandler(DelegatingMetaTagHandler.java:131)
at com.sun.faces.facelets.tag.jsf.ComponentTagHandlerDelegateImpl.apply(ComponentTagHandlerDelegateImpl.java:162)

Hm…receio que o seu converter deve ser usado na tag h:selectOneMenu… A proposito, que código monstruoso de converter é esse? :shock:

Mas concordo que o converter nao faria diferença, nao é String que voce está enviando? O JSF já se vira com essa tipagem…algo de errado no seu formulário há.

E os outros campos, estao chegando ao manged-bean?

Esse converter ae seria útil se o ítem selecionado fosse passado como um NUMERO representado como uma String, p.e., “1” ,“2”.
Não conseguí uma adaptação ainda…

Tem um outro campo que não estah chegando, estou vendo o q pode estar acontecendo, se é pq uso um form dentro de outro, etc. Muito estanho, em mensagem anterior desse mesmo post eu mostro o outro campo que não estah chegando.

Porque você não usa um form apenas?

Usei o Converter corretamente com o SelectOneRadio:

....
<h:selectOneRadio id="sonSIE" value="#{ProtocoloBean.protocolo.flgSie}" disabled="#{ ProtocoloBean.disabled_1  }">
				<f:converter converterId="indexConverter"/>
				<f:selectItem  itemLabel="Sim" itemValue="S"/>
				<f:selectItem  itemLabel="Não" itemValue="N"/>
</h:selectOneRadio>
....

O erro de concerter sumiu, mas o msm do início do POST continua, aberração parece ser no formulário mesmo…

Os “includes” do Facelet’s acabam nos induzindo ao aninhamento de forms, vou colocar td em apenas um form e ja coloco aqui o resultado.

Acho que teu erro esta em ter 2 “forms” reduza para um apenas e tenta.

Putz amigos, era o aninhamento dos forms, foi só desaninhar, deixar tudo em um único formulário, tudo funcionou corretamente, obrigado a todos.

Deixei td em um único form e funcionou, obrigado a todos…

cara,

posta o log erro completo