Rich:DataTable e selectOneRadio não persistem

Olá, pessoal, estou com um problema com uma dataTable, pela qual, gostaria de submeter um valor selecionado ao banco, toda vez que selecionar, fechar a janela modal e submeter ao formulário.
O problema está ao salvar, onde nada acontece, meu problema está relacionado em como submeter o valor a partir de um selectOneRadio, pelo qual estou totalmente perdido.
Para tal criei um Wrapper, que deveria carregar o atributo específico vindo do bean, no mesmo setá-lo e submetê-lo
Tabela:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"></meta>
</h:head>

<h:body>
	<f:view>
		<h:form>
			<rich:popupPanel id="modalPanelReceptor" modal="false" width="600"
				moveable="false">
				<f:facet name="header">
					<h:outputText value="Defina o Receptor"></h:outputText>
				</f:facet>

				<f:facet name="controls">
					<h:outputLink value="#" style="text-decoration:none;"
						onclick="#{rich:component('modalPanelReceptor')}.hide(); return false;">X</h:outputLink>
				</f:facet>

				<rich:dataTable value="#{atendimentoBean.listaReceptores}"
					id="table" var="_receptor" style="width: 100%;" rowKeyVar="ind"
					noDataLabel="Não existem receptores cadastrados.">

					<rich:column width="10%">
						<f:facet name="header">
							<h:outputText value="Nome do Receptor" />
						</f:facet>
						<h:outputText value="#{_receptor.nomeReceptor}"></h:outputText>
					</rich:column>

					<rich:column width="25%">
						<f:facet name="header">
							<h:outputText value="Tipo sanguíneo do receptor" />
						</f:facet>
						<h:outputText value="#{_receptor.tipoSanguineo}"></h:outputText>
					</rich:column>

					<rich:column width="25%">
						<f:facet name="header">
							<h:outputText value="Tipo Hemoderivado do receptor" />
						</f:facet>
						<h:outputText value="#{_receptor.tipoHemo}"></h:outputText>
					</rich:column>

					<rich:column width="20%">
						<f:facet name="header">
							<h:outputText value="selecione" />
						</f:facet>
						<h:selectOneRadio id="myRadio#{Ind}"
							value="#{atendimentoBean.atendimentoEdicao.receptor}">
							<f:selectItem
								value="#{atendimentoBean.atendimentoEdicao.receptor}"
								itemValue="#{atendimentoBean.atendimentoEdicao.receptor}"
								itemLabel="#{atendimentoBean.atendimentoEdicao.receptor}"></f:selectItem>
						</h:selectOneRadio>
					</rich:column>
				</rich:dataTable>
			</rich:popupPanel>
			<br />
		&lt;/h:form&gt;
	&lt;/f:view&gt;
&lt;/h:body&gt;
&lt;/html&gt;

ManagedBean Atendimento:

package br.com.agets.visao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import br.com.agets.dominio.Atendimento;
import br.com.agets.dominio.Doador;
import br.com.agets.dominio.Receptor;
import br.com.agets.dominio.TipoHemoderivado;
import br.com.agets.dominio.TipoSanguineo;
import br.com.agets.negocio.AtendimentoService;
import br.com.agets.negocio.DoadorService;
import br.com.agets.negocio.ReceptorService;
import br.com.agets.negocio.RegraNegocioException;

@ManagedBean(name = "atendimentoBean")
@SessionScoped
public class AtendimentoBean {

	private Atendimento atendimentoEdicao;
	private Receptor receptorSelecionado;
	private List&lt;Atendimento&gt; atendimentos = new ArrayList&lt;Atendimento&gt;();
	private List&lt;SelectItem&gt; tiposHemoderivados;
	private List&lt;SelectItem&gt; tiposSanguineos;

	private List&lt;DoadoresWrapper&gt; ListaDoadores;
	private List&lt;ReceptoresWrapper&gt; ListaReceptores;

	private List&lt;Doador&gt; doadoresSelecionados;

	public String inicializar() {
		this.atendimentoEdicao = new Atendimento();
		this.tiposHemoderivados = null;
		this.tiposSanguineos = null;
		this.atendimentos = null;
		this.ListaReceptores = null;
		this.ListaDoadores = null;
		return "incluirAtendimento2";
	}

	public void salvar(ActionEvent event) {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			if (this.receptorSelecionado != null) {
				atendimentoEdicao.setReceptor(receptorSelecionado);
			}

			new AtendimentoService().salvar(this.atendimentoEdicao);
			FacesMessage msg = new FacesMessage(
					"Atendimento Cadastrado com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);

			inicializar();
		} catch (RegraNegocioException e) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(
					"Erro inesperado ao cadastrar atendimento! "
							+ e.getMessage());
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public List&lt;String&gt; sugerirNomeReceptor(Object event) {
		return new ReceptorService().pesquisarReceptores(event.toString());

	}

	public void excluir() {
		FacesContext context = FacesContext.getCurrentInstance();
		try {
			new AtendimentoService().excluir(this.atendimentoEdicao);
			this.atendimentos.remove(this.atendimentoEdicao);
			FacesMessage msg = new FacesMessage(
					"Atendimento excluí­do com sucesso!");
			msg.setSeverity(FacesMessage.SEVERITY_INFO);
			context.addMessage(null, msg);
		} catch (RegraNegocioException e) {
			context.addMessage(
					null,
					new FacesMessage(FacesMessage.SEVERITY_ERROR, e
							.getMessage(), e.getMessage()));
		} catch (Exception e) {
			e.printStackTrace();
			FacesMessage msg = new FacesMessage(
					"Erro inesperado ao excluir atendimento!");
			msg.setSeverity(FacesMessage.SEVERITY_ERROR);
			context.addMessage(null, msg);
		}
	}

	public void selecionar(Receptor receptor) {
		this.receptorSelecionado = receptor;
	}

	public List&lt;ReceptoresWrapper&gt; getListaReceptores() {
		if (this.ListaReceptores == null) {
			List&lt;Receptor&gt; receptores = new ReceptorService().listarTodos();
			this.ListaReceptores = new ArrayList&lt;ReceptoresWrapper&gt;();
			if (receptores != null && receptores.isEmpty()) {
				for (Receptor receptor : receptores) {
					ReceptoresWrapper receptorWrapper = new ReceptoresWrapper();
					receptorWrapper.setReceptor(receptor);
					ListaReceptores.add(receptorWrapper);
				}
			}
		}
		return this.ListaReceptores;

	}

	public List&lt;DoadoresWrapper&gt; getListaDoadores() {
		if (this.ListaDoadores == null) {
			List&lt;Doador&gt; doadores = new DoadorService().listarTodos();
			this.ListaDoadores = new ArrayList&lt;DoadoresWrapper&gt;();
			if (doadores != null && !doadores.isEmpty()) {
				for (Doador doador : doadores) {
					DoadoresWrapper doadorWrapper = new DoadoresWrapper();
					// if (doadorWrapper.isSelecionado()) {
					doadorWrapper.setDoador(doador);
					// }
					ListaDoadores.add(doadorWrapper);
				}
			}
		}
		//
		return this.ListaDoadores;

	}

	public List&lt;SelectItem&gt; getTiposHemoderivados() {
		if (this.tiposHemoderivados == null) {
			this.tiposHemoderivados = new ArrayList&lt;SelectItem&gt;();
			this.tiposHemoderivados.add(new SelectItem(null, "Selecione"));
			for (TipoHemoderivado tipos : TipoHemoderivado.values()) {
				this.tiposHemoderivados.add(new SelectItem(tipos.toString()));
			}
		}
		return tiposHemoderivados;
	}

	public List&lt;SelectItem&gt; getTiposSanguineos() {
		if (this.tiposSanguineos == null) {
			this.tiposSanguineos = new ArrayList&lt;SelectItem&gt;();
			this.tiposSanguineos.add(new SelectItem(null, "Selecione"));
			for (TipoSanguineo tipos : TipoSanguineo.values()) {
				this.tiposSanguineos.add(new SelectItem(tipos.toString()));
			}
		}
		return tiposSanguineos;
	}

	public Atendimento getAtendimentoEdicao() {
		return atendimentoEdicao;
	}

	public void setAtendimentoEdicao(Atendimento atendimentoEdicao) {
		this.atendimentoEdicao = atendimentoEdicao;
	}

	public Receptor getReceptorSelecionado() {
		return receptorSelecionado;
	}

	public void setReceptorSelecionado(Receptor receptorSelecionado) {
		this.receptorSelecionado = receptorSelecionado;
	}

	public List&lt;Atendimento&gt; getAtendimentos() {
		return atendimentos;
	}

	public void setAtendimentos(List&lt;Atendimento&gt; atendimentos) {
		this.atendimentos = atendimentos;
	}

	public List&lt;Doador&gt; getDoadoresSelecionados() {
		return doadoresSelecionados;
	}

	public void setDoadoresSelecionados(List&lt;Doador&gt; doadoresSelecionados) {
		this.doadoresSelecionados = doadoresSelecionados;
	}

	public void setTiposHemoderivados(List&lt;SelectItem&gt; tiposHemoderivados) {
		this.tiposHemoderivados = tiposHemoderivados;
	}

	public void setTiposSanguineos(List&lt;SelectItem&gt; tiposSanguineos) {
		this.tiposSanguineos = tiposSanguineos;
	}

	public void setListaDoadores(List&lt;DoadoresWrapper&gt; listaDoadores) {
		ListaDoadores = listaDoadores;
	}

}

Não sei se é relevante, mas não custa, Wrapper receptor:

package br.com.agets.visao;

import br.com.agets.dominio.Receptor;

public class ReceptoresWrapper {
	private Receptor receptor;
	private Boolean selecionado;

	public Receptor getReceptor() {
		return receptor;
	}

	public void setReceptor(Receptor receptor) {
		this.receptor = receptor;
	}

	public Boolean getSelecionado() {
		return selecionado;
	}

	public void setSelecionado(Boolean selecionado) {
		this.selecionado = selecionado;
	}

}

Agradeço aos que puderem ajudar.

Ninguém???!!!

Antes de tudo se atente ao nosso How To, existem dicas lá de como montar suas perguntas, no seu caso, especificamente essa:[quote]10. Evite “upar” tópicos. Se seu tópico ficar muito tempo sem resposta, procure complementá-lo com mais informações, e perguntar para o pessoal o que não ficou claro em sua postagem. [/quote]
Agora quanto ao seu problema, a sua dúvida é como fazer o submit através de um radio? Já tentou fazer algo com ajax? Ex:<h:selectOneRadio id="myRadio#{Ind}" value="#{atendimentoBean.atendimentoEdicao.receptor}" onchange="submit();"> <f:selectItem value="#{atendimentoBean.atendimentoEdicao.receptor}" itemValue="#{atendimentoBean.atendimentoEdicao.receptor}" itemLabel="#{atendimentoBean.atendimentoEdicao.receptor}" /> <f:ajax event="change" execute="@this" render="@this" /> </h:selectOneRadio> E aliás, pra que esse radio que só tem uma opção? Não faz muito sentido.

Perdão pela descortezia, mas estava mesmo desesperado, ninguém tinha respondido há mais de três semanas, e vários posts iguais e nada…
Mas a idéia e submeter apenas um receptor selecionado a um atendimento, por isso o radioButton.

[quote=smnj]Perdão pela descortezia, mas estava mesmo desesperado, ninguém tinha respondido há mais de três semanas, e vários posts iguais e nada…
Mas a idéia e submeter apenas um receptor selecionado a um atendimento, por isso o radioButton.[/quote]
Talvez a ausência de respostas seja justamente por não seguir as regras do fórum, isso não motiva ninguém a te ajudar.

A solução que eu sugeri resolveu seu problema ?

Null pointer

Bom, o NullPointer indica que pelo menos os seu formulário foi submetido, mas se você quiser ajuda com a solução, vai ter que ser mais específico do que isso.

Rodrigo, tive algo diferente agora, um LazyInicialization exception.

Bem, pegou o objeto selecionado, mas preciso ir mais além, como você sugeriu, estou testando agora.

Observe, que no código que postei, o receptor será adiocionado se isSelecionado for True. É Nisso que estou errando, por causa disso o receptor é null.

Para obter a lista de receptores e salvá-la uso um wrapper, contendo um objeto receptor e um boolean, que, será adicionado ao bean receptor se o mesmo boolean for true, o que deverá ser determinado pelo selecOneRadio.

me ajuda com essa lógica?

Será que o problema não está aqui:if (receptores != null && receptores.isEmpty()) { ?

vi isso depois que postei, troquei por isso:

if (receptores != null && !receptores.isEmpty()) {

mas, não creio que resolveria, sendo que isso apenas faria a listar ser povoada, percorrida e atribuída ao Wrapper.
Meu objetivo é esse nesse instante, após isso, determinar todos os registro selecionados como true no wrapper em selecionado no booelan, mas não tenho idéia de como fazê-lo no momento.

penso em fazer o mesmo na outra entidade (doador), porem usando checkboxes, já que serão vários selecionados, e não apenas um.

Como você pretende saber qual é selecionado se todos estão associados ao mesmo objeto Atendimento ?

Tentou fazer com um setPropertyActionListener?

Me ajuda, como faço isso?
quais parâmetros passo?

Não parece aceitar:

javax.servlet.ServletException: /components/modalPanelReceptor.xhtml @66,63 &lt;f:setPropertyActionListener&gt; Parent is not of type ActionSource, type is: javax.faces.component.html.HtmlSelectOneRadio@e6eb7c javax.faces.webapp.FacesServlet.service(FacesServlet.java:521)

[quote=smnj]Não parece aceitar:

javax.servlet.ServletException: /components/modalPanelReceptor.xhtml @66,63 &lt;f:setPropertyActionListener&gt; Parent is not of type ActionSource, type is: javax.faces.component.html.HtmlSelectOneRadio@e6eb7c javax.faces.webapp.FacesServlet.service(FacesServlet.java:521)[/quote]
Ah, verdade. Teria que ser um botão, ou um commandLink, por que você não faz com esses componentes? O que o usuário clicar, será o selecionado da mesma forma.

Pelo visto, não preciso verificar se está marcado para setar, tirando a verificação funciona, dispensando o If, mas este erro ocorre ao persistir, mesmo submetendo o valor no banco.

java.lang.ClassCastException: br.com.agets.dominio.Receptor cannot be cast to javax.faces.model.SelectItem

porquê e como resolver?

Pareceu mais intuitivo mostrar ao usuário o que ele poderia selecionar através do radio, já que ele pode ver o que seleciona, por assim dizer…
não via o commandLink da mesma forma…
mas veja, consegui, apesar da mensagem de erro…

Esse é um erro básico de Java, você está tentando fazer um cast de uma classe para outra, e esse cast não é permitido.

Agora você tem que encontrar aonde que isso está acontecendo.

Será que pode ser o converter?

package br.com.agets.conversores;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import br.com.agets.dominio.Receptor;
import br.com.agets.negocio.ReceptorService;

@FacesConverter(value = "receptorConverter")
public class ReceptorConverter implements Converter {
	public Object getAsObject(FacesContext context, UIComponent component,
			String value) throws ConverterException {
		if (value == null) {
			return null;
		}
		return new ReceptorService().pesquisaPorId(Long.parseLong(value));
	}

	public String getAsString(FacesContext context, UIComponent component,
			Object object) throws ConverterException {
		if (object == null) {
			return null;
		}
		Receptor receptor = (Receptor) object;
		return receptor.getId().toString();
	}

}