Tenho um form que recebe um objeto mensagem.
nesta mensagem tem 2 campos (origem e destino) que é tambem um objeto chamado amigo.
Acontece que quando eu envio os objetos origem e destino para o form ele dá a mensagem: type mismatch.
packagebr.com.tesb.amigosecreto.form;importjava.io.Serializable;importjavax.servlet.http.HttpServletRequest;importorg.apache.struts.action.ActionErrors;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionMapping;importorg.apache.struts.action.ActionMessage;importbr.com.tesb.amigosecreto.modelo.Mensagem;publicclassAdicionaMsgFormextendsActionFormimplementsSerializable{privatestaticfinallongserialVersionUID=-594519282863906608L;privateMensagemmensagem=newMensagem();publicMensagemgetMensagem(){returnthis.mensagem;}publicbooleanstringVazia(Stringvalor){returnvalor==null||valor.trim().length()==0;}@OverridepublicActionErrorsvalidate(ActionMappingmap,HttpServletRequestreq){System.out.println("Estou Aqui");//verifica a MensagemActionErrorserros=newActionErrors();if(stringVazia(mensagem.getMsg())){erros.add("mensagem",newActionMessage("erro.campoMensagem"));}//verifica o Destino//if (mensagem.getDestino() == null) {// erros.add("destino", new ActionMessage("erro.campoDestino"));//}// verifica campo origem//if (mensagem.getOrigem() == null) {// erros.add("origem", new ActionMessage("erro.campoOrigem"));//}returnerros;}@Overridepublicvoidreset(ActionMappingmap,HttpServletRequestreq){this.mensagem=newMensagem();}}
Agora Vai a Action… .
packagebr.com.tesb.amigosecreto.action;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importorg.apache.struts.action.Action;importorg.apache.struts.action.ActionForm;importorg.apache.struts.action.ActionForward;importorg.apache.struts.action.ActionMapping;importorg.hibernate.Session;importbr.com.tesb.amigosecreto.form.AdicionaMsgForm;importbr.com.tesb.amigosecreto.modelo.Mensagem;importbr.com.tesb.amigosecreto.persistencia.HibernateFactory;importbr.com.tesb.amigosecreto.persistencia.MensagemDAO;publicclassAdicionaMsgActionextendsAction{@OverridepublicActionForwardexecute(ActionMappingmap,ActionFormform,HttpServletRequestreq,HttpServletResponseres)throwsException{// formulario de clienteAdicionaMsgFormformulario=((AdicionaMsgForm)form);// acessa o beanMensagemmsg=formulario.getMensagem();Sessionsession=newHibernateFactory().getSession();MensagemDAOmsgdao=newMensagemDAO(session);msgdao.adiciona(msg);session.close();//ok...visualizaçãoreturnmap.findForward("ok");}}
mensagem.origem (olhando seu FormBean) é um Objeto do tipo Amigo. Porém o valor que você está tentando colocar para esse objeto é um número, um int. Não um amigo.
O que você provavelmente quer fazer é:
Ou seja, preencher o id do seu objeto. Você vai precisar então recarregar esse Amigo na próxima requisição, isso exatamente pelo fato de que o protocolo http não mantém estado entre as requisições.
Dentro do html:select, o mesmo problema. mensagem.destino é um objeto do tipo Amigo. Você provavelmente quer preencher o id do destino:
<html:select property="mensagem.destino.id">
<html:option value="${amigo.amigo.id}">Meu Amigo</html:option>
<html:option value="${amigo.tirou.id}">Quem me Tirou</html:option>
</html:select>
K
klausaraujo
Fabio,
Cara acho que não é isso, pois veja o seguinte:
Resolvi este problema com as seguintes soluções, porem acho que isso que fiz é muito deselegante pra não dizer gambiarra, veja:
Crei uma outra classe igual a Mensagem porem em vez de receber um Amigo na Origem e Destino ela recebe um Int.
Alterei o meu form para usar esta a classe MensagemAdd
publicclassAdicionaMsgFormextendsActionFormimplementsSerializable{privatestaticfinallongserialVersionUID=-594519282863906608L;privateMensagemAddmensagem=newMensagemAdd();publicMensagemAddgetMensagem(){returnthis.mensagem;}publicbooleanstringVazia(Stringvalor){returnvalor==null||valor.trim().length()==0;}@OverridepublicActionErrorsvalidate(ActionMappingmap,HttpServletRequestreq){System.out.println("Estou Aqui");//verifica a MensagemActionErrorserros=newActionErrors();if(stringVazia(mensagem.getMsg())){erros.add("mensagem",newActionMessage("erro.campoMensagem"));}//verifica o Destino//if (mensagem.getDestino() == null) {// erros.add("destino", new ActionMessage("erro.campoDestino"));//}// verifica campo origem//if (mensagem.getOrigem() == null) {// erros.add("origem", new ActionMessage("erro.campoOrigem"));//}returnerros;}@Overridepublicvoidreset(ActionMappingmap,HttpServletRequestreq){this.mensagem=newMensagemAdd();}}
Alterei a Minha action para receber essa MensagemAdd e Converter em Mensagem antes de persistir.
Achei a solução acima meio feia, ter que criar mais uma classe só pq eu num consigo passar um objeto como parametro, só tipos primitivos!!!
Outra solução que encontrei foi criar os campos da classe POJO no Form e realizar os setters manualmente na POJO, veja abaixo como ficou o form abaixo:
Ai Na Action é só chamar o getAmg() que vc consegue o Amigo pra persistir…
Os dois metodos acima funciona, mas acho que isto não é o certo.
Valeu…
Fabio_Kung
Oi Klaus,
Era exatamente isso que eu tinha postado para você fazer, só que ao invés de criar uma classe nova ou colocar todos os atributos de Amigo no seu FormBean, eu tinha dito para você preencher os atributos do próprio objeto Amigo dentro do seu FormBean.
Isso é uma restrição do protocolo http, quando trabalhamos com a web. Http só conhece String. O Struts ainda faz um pequeno trabalho de converter para números quando precisa (outros frameworks fazem um trabalho melhor de conversão de valores).
O Struts não tem a mínima idéia de como converter uma String que vem na requisição para um objeto do tipo Amigo. O máximo que você consegue fazer é preencher alguns campos do seu objeto amigo com Strings e números:
e não:
Denovo: o Struts sabe converter a String id que vem na requisição para o int (ou Long) id do seu objeto amigo, mas não a String que vem na requisição para um objeto completo Amigo.
K
klausaraujo
Fabio,
Agora entendi cara. Puxa muito obrigado pela explicação.