[RESOLVIDO] Erro de validação: o valor não é válido (RadioButton)
12 respostas
A
Amaster
Opa turma, tudo bom?
É o seguinte tem 2 dias que estou com esse erro e não consigo solucionar, já vasculhei por inúmeros tópicos aqui do fórum, mas nenhum conseguiu me ajudar de fato.
Estou desenvolvendo um sistema de perguntas e respostas simples, porém quando selecione um item do radio button da o erro:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><htmlxmlns="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.org/ui"><h:head><title>Desafio</title></h:head><h:body><h:formid="formDesafio"><p:messagesautoUpdate="true"/><h:outputTextvalue="#{desafioMB.pergunta.texto}"/><br/><p:selectOneRadioid="respostas"value="#{desafioMB.respostaSelecionada}"required="true"requiredMessage="#{msg.respostaPerguntaRequired}"><f:selectItemsvalue="#{desafioMB.pergunta.respostas}"var="r"itemValue="#{r}"itemLabel="#{r.resposta}"/></p:selectOneRadio><p:commandButtonvalue="#{msg.responder}"action="#{desafioMB.responder}"/><p:commandButtonvalue="#{msg.desistir}"onclick="desistirDlg.show()"/><br/></h:form><p:confirmDialogwidgetVar="desistirDlg"id="desistirDialog"header="#{msg.desafio_desistir_titulo}"message="#{msg.desafio_desistir_pergunta}"><h:form><p:commandButtonvalue="#{msg.sim}"oncomplete="desistirDlg.hide()"action="#{desafioMB.desistir}"/><p:commandButtonvalue="#{msg.nao}"onclick="desistirDlg.hide()"type="button"/></h:form></p:confirmDialog></h:body></html>
Meu BackBean:
@ManagedBean@ViewScopedpublicclassDesafioMBextendsAbstractMB{@EJBprivatePerguntaFacadeperguntaFacade;@EJBprivateRespostaFacaderespostaFacade;privatePerguntapergunta=newPergunta();privateRespostarespostaSelecionada=newResposta();privateList<Pergunta>perguntas;publicvoidresponder(){//se a resposta selecionada for igual a 1 ela é a corretaif(respostaSelecionada.getCorreta()==1){//faz ações se o usuário acertar}else{//faz ações se o usuário errar}}//getters e setters
Já tentei criar um custom converter, mas não deu certo
Já passar apenas o id para o backbean e depois recupear o objeto através do id, mas da o mesmo erro
Só lembrar que tem que implementar equals e hashcode no classe que você quer converter, no caso Resposta.
Eu tinha feito o seguinte, mapeava para passar apenas o id para o mb, ai fiz esse converter aqui mas não adiantou nada:
publicclassLongConverterimplementsConverter{publicObjectgetAsObject(FacesContextarg0,UIComponentarg1,Stringvalor)throwsConverterException{Longresultado=null;try{resultado=newLong(Long.parseLong(valor));}catch(NumberFormatExceptionnfe){thrownewConverterException(valor+" não é um número válido!",nfe);}returnresultado;}publicStringgetAsString(FacesContextarg0,UIComponentarg1,Objectobj)throwsConverterException{Stringresultado="";if(obj!=null){resultado=obj.toString();}returnresultado;}}
L
lele_vader
O getAsObject tinha que retornar o seu objeto resposta não ?
você implementou o método toString da classe Resposta, pois você chama toString em getAsString.
Acredito que o toString você pode retornar o id do objeto para no getAsObject pegar esse id e consultar pelo objeto completo.
A
Amaster
lele_vader:
O getAsObject tinha que retornar o seu objeto resposta não ?
você implementou o método toString da classe Resposta, pois você chama toString em getAsString.
Acredito que o toString você pode retornar o id do objeto para no getAsObject pegar esse id e consultar pelo objeto completo.
Então como estou utilizando EJB, li que converteres ainda não dão suporte para injeção de dependência. Teria outra forma de buscar esse objeto, ou só por lookup?
L
lele_vader
Nesse exemplo foi criado um managedBean para colocar o converter, e nele foi colocado um EJB com injeção de dependência.
H
Hebert_Coelho
lele_vader:
Nesse exemplo foi criado um managedBean para colocar o converter, e nele foi colocado um EJB com injeção de dependência.
Sendo que respostaSelecionada é o objeto Resposta e respostaId é um Long.
E no converter eu receberia o id e retornaria o objeto?
A
Amaster
Não funcionou :(
Fiz meu converter assim:
publicclassLongConverterimplementsConverter{publicObjectgetAsObject(FacesContextarg0,UIComponentarg1,Stringvalor)throwsConverterException{InitialContextini=null;Respostaresposta=null;try{RespostaFacaderespostaFacade=(RespostaFacade)ini.lookup("java:module/RespostaFacade");resposta=respostaFacade.buscaPorId(Long.valueOf(valor));}catch(NamingExceptione){e.printStackTrace();}catch(NumberFormatExceptionnfe){thrownewConverterException(valor+" não é um número válido!",nfe);}returnresposta;}publicStringgetAsString(FacesContextarg0,UIComponentarg1,Objectobj)throwsConverterException{Stringresultado="";if(obj!=null){resultado=obj.toString();}returnresultado;}}
Quando eu clico em responder, não acontece nada... tentei debugar, mas nada também... alguma sugestão?
L
lele_vader
No value acho que ficaria respostaSelecionada, o qual é um objeto Resposta.
O que o converter vai fazer é pegar o seu objeto e colocar o select como long e quando der o submit pegar o long e transformar em objeto de novo, acredito eu.
Dá uma olhada no exemplo que te passei.
A
Amaster
lele_vader:
No value acho que ficaria respostaSelecionada, o qual é um objeto Resposta.
O que o converter vai fazer é pegar o seu objeto e colocar o select como long e quando der o submit pegar o long e transformar em objeto de novo, acredito eu.
Dá uma olhada no exemplo que te passei.
Bom consegui resolver o problema, o que eu fiz foi:
Troquei o contexto de ViewScoped para RequestScoped