Olá caros, estou tendo um problema, gostaria de contar com a ajuda dos prezados, se for possível:
Tenho um relacionamento com 3 entidades, sendo elas receptor, atendimento e doador - onde para um atendimento preciso de um receptor e vários doadores.
Para submeter os doadores ao atendimento não tive problemas, eu consegui.
Mas o meu problema está na parte de receptor.
Onde em uma dataTable, o usuário deve submeter um receptor através de um radioButonn, o que não tenho problema, exceto pelo fato de que é possível selecionar mais de um.
Como resolver?
Podem ajudar?
Este é meu ManagedBean:
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.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.richfaces.component.UIDataTable;
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 UIDataTable uiDataTable;
private List<Atendimento> atendimentos = new ArrayList<Atendimento>();
private List<SelectItem> tiposHemoderivados;
private List<SelectItem> tiposSanguineos;
private Receptor receptorSelecionado;
private List<Receptor> listaReceptores;
private List<DoadoresWrapper> listaDoadores;
private List<Doador> doadoresSelecionados;
public String inicializar() {
this.atendimentoEdicao = new Atendimento();
this.tiposHemoderivados = null;
this.tiposSanguineos = null;
this.atendimentos = null;
this.listaDoadores = null;
this.listaReceptores = null;
return "incluirAtendimento";
}
public void salvar(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
try {
List<Doador> doadores = new ArrayList<Doador>();
for (DoadoresWrapper doadoresWrapper : listaDoadores) {
if (doadoresWrapper.isSelecionado()) {
doadores.add(doadoresWrapper.getDoador());
}
List<Receptor> receptores = new ArrayList<Receptor>();
for (Receptor receptorSelecionado : receptores) {
receptores.add(receptorSelecionado);
}
}
atendimentoEdicao.setReceptor(receptorSelecionado);
atendimentoEdicao.setDoadores(doadores);
new AtendimentoService().salvar(this.atendimentoEdicao);
atendimentoEdicao.setDoadores(doadores);
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<String> 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 setReceptorSelecionado(ValueChangeEvent event) {
receptorSelecionado = (Receptor) uiDataTable.getRowData();
System.out.println(receptorSelecionado);
listaReceptores = new ArrayList<Receptor>();
listaReceptores.add(receptorSelecionado);
}
public List<Receptor> getListaReceptores() {
if (this.listaReceptores == null) {
this.listaReceptores = new ReceptorService().listarTodos();
}
return this.listaReceptores;
}
public List<DoadoresWrapper> getListaDoadores() {
if (this.listaDoadores == null) {
List<Doador> doadores = new DoadorService().listarTodos();
this.listaDoadores = new ArrayList<DoadoresWrapper>();
if (doadores != null && !doadores.isEmpty()) {
for (Doador doador : doadores) {
DoadoresWrapper doadorWrapper = new DoadoresWrapper();
doadorWrapper.setDoador(doador);
listaDoadores.add(doadorWrapper);
}
}
}
return this.listaDoadores;
}
public List<SelectItem> getTiposHemoderivados() {
if (this.tiposHemoderivados == null) {
this.tiposHemoderivados = new ArrayList<SelectItem>();
this.tiposHemoderivados.add(new SelectItem(null, "Selecione"));
for (TipoHemoderivado tipos : TipoHemoderivado.values()) {
this.tiposHemoderivados.add(new SelectItem(tipos.toString()));
}
}
return tiposHemoderivados;
}
public List<SelectItem> getTiposSanguineos() {
if (this.tiposSanguineos == null) {
this.tiposSanguineos = new ArrayList<SelectItem>();
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 List<Atendimento> getAtendimentos() {
return atendimentos;
}
public void setAtendimentos(List<Atendimento> atendimentos) {
this.atendimentos = atendimentos;
}
public UIDataTable getUiDataTable() {
return uiDataTable;
}
public void setUiDataTable(UIDataTable uiDataTable) {
this.uiDataTable = uiDataTable;
}
public List<Doador> getDoadoresSelecionados() {
return doadoresSelecionados;
}
public void setDoadoresSelecionados(List<Doador> doadoresSelecionados) {
this.doadoresSelecionados = doadoresSelecionados;
}
public void setTiposHemoderivados(List<SelectItem> tiposHemoderivados) {
this.tiposHemoderivados = tiposHemoderivados;
}
public void setTiposSanguineos(List<SelectItem> tiposSanguineos) {
this.tiposSanguineos = tiposSanguineos;
}
public void setListaDoadores(List<DoadoresWrapper> listaDoadores) {
this.listaDoadores = listaDoadores;
}
public void setListaReceptores(List<Receptor> listaReceptores) {
this.listaReceptores = listaReceptores;
}
public Receptor getReceptorSelecionado() {
return receptorSelecionado;
}
}
Este é a tabela pela qual obtenho os dados, e o radio que buscaria o valor que necessito:
<?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">
<ui:composition>
<f:view>
<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}"
var="_receptor" style="width: 100%;"
binding="#{atendimentoBean.uiDataTable}"
noDataLabel="Não existem receptores cadastrados." rowKeyVar="index">
<rich:column width="40%">
<f:facet name="header">
<h:outputText value="Selecione" />
</f:facet>
<h:selectOneRadio onclick="radioButton(this);"
valueChangeListener="#{atendimentoBean.setReceptorSelecionado}"
value="#{atendimentoBean.atendimentoEdicao.receptor}"
converter="receptorConverter">
<f:selectItem itemValue="#{_receptor}">
</f:selectItem>
</h:selectOneRadio>
</rich:column>
<rich:column width="40%">
<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:dataTable>
<a4j:commandButton value="OK"
onclick="#{rich:component('modalPanelReceptor')}.hide(); return
false;" />
</rich:popupPanel>
<br />
</f:view>
</ui:composition>
</html>
O único problema é que posso selecionar mais de um. Têm alguma idéia de como resolver?