JSF + SelectOneRadio não funciona

20 respostas
K

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…

20 Respostas

A

cara,

crie uma classe converter e atribua a seu componente.

t+

H

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?

K

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…

K

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>
K

O campo ProtocoloBean.value estah chegando vazio no MBean…

A

cara,

so usar o converter que vai funcionar.

t+

H

alissonvla:
cara,

so usar o converter que vai funcionar.

t+

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

A

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

t+

K

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)
A

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?

K

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…

K

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.

H

Porque você não usa um form apenas?

K

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…

K

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.

H

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

K

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

K

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

A

cara,

posta o log erro completo

K

Alisson, usei o Converter corretamente e o erro persistiu, observei q outro campo desse mesmo formulário estava com problemas tbém no MBean. Notei que havia um formulário dentro de outro formulário, aninahmento de formulários. Deixei tudo dentro de um mesmo formulário e funcionou corretamente, o problema foi corrigido. Ja tive problema parecido com algum componente sendo usando dentro de formulários aninhados. Valew tua atenção meu brow… e a todos q participaram do POST… abçs

Criado 31 de outubro de 2011
Ultima resposta 31 de out. de 2011
Respostas 20
Participantes 4