Dúvida com o encapsulamento de uma variavel do tipo objeto no Struts

6 respostas
pimentaft

Seguindo por esta classe ActionForm:

import org.apache.struts.action.ActionForm;

public class Pessoa extends ActionForm

{

/**

*

*/

private static final long serialVersionUID = 1L;
public String codPessoa;

public String nomePessoa;

public String telefone;

private Logradouro logradouro;

public String getCodPessoa() {
	return codPessoa;
}

public void setCodPessoa(String codPessoa) {
	this.codPessoa = codPessoa;
}

public String getNomePessoa() {
	return nomePessoa;
}

public void setNomePessoa(String nomePessoa) {
	this.nomePessoa = nomePessoa;
}

public String getTelefone() {
	return telefone;
}

public void setTelefone(String telefone) {
	this.telefone = telefone;
}

public Logradouro getLogradouro() {
	return logradouro;
}

public void setLogradouro(Logradouro logradouro) {
	this.logradouro = logradouro;
}

}
E a outra classe com o nome logradouro:

import org.apache.struts.action.ActionForm;

public class Logradouro extends ActionForm

{

/**

*

*/

private static final long serialVersionUID = 1L;
public String codLogradouro;

public String nomeLogradouro;

public String cep;

private Bairro Bairro;

public String getCodLogradouro() {
	return codLogradouro;
}

public void setCodLogradouro(String codLogradouro) {
	this.codLogradouro = codLogradouro;
}

public String getNomeLogradouro() {
	return nomeLogradouro;
}

public void setNomeLogradouro(String nomeLogradouro) {
	this.nomeLogradouro = nomeLogradouro;
}

public String getCep() {
	return cep;
}

public void setCep(String cep) {
	this.cep = cep;
}

public Bairro getBairro() {
	return Bairro;
}

public void setBairro(Bairro bairro) {
	Bairro = bairro;
}

}

E o jsp:

<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix=“bean”%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix=“html”%>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix=“logic”%>

<html:html locale=“true”>

Nome:

Telefone:

CEP:

E segue o erro:

exception

org.apache.jasper.JasperException: Invalid argument looking up property logradouro.cep of bean org.apache.struts.taglib.html.BEAN

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056)

org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:261)

org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388)

org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:316)

org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231)

org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)

org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)

javax.servlet.http.HttpServlet.service(HttpServlet.java:689)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

javax.servlet.ServletException: Invalid argument looking up property logradouro.cep of bean org.apache.struts.taglib.html.BEAN

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)

org.apache.jsp.pages.cadastro_jsp._jspService(cadastro_jsp.java:82)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1056)

org.apache.struts.tiles.TilesRequestProcessor.doForward(TilesRequestProcessor.java:261)

org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:388)

org.apache.struts.tiles.TilesRequestProcessor.processForwardConfig(TilesRequestProcessor.java:316)

org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:231)

org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)

org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:397)

javax.servlet.http.HttpServlet.service(HttpServlet.java:689)

javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Alguem pode me ajudar???Eu jah estou a meses procurando por essa resposta…

6 Respostas

doug

Olá
Então esse erro está sendo causado por não ter inicializado a classe logradouro dentro da classe pessoa
Fica mais ou menos assim… vc faz uma sobrecarga no metodo reset do Struts

public Pessoa extends ActionForm{
   //gets e sets

   public void reset(ActionMapping mapping, HttpServletRequest request){
     super.reset(mapping, request);
     logradouro = new Logradouro();
   }
}

Se não me engano é assim a assinatura deste metodo… qualquer coisa o Ctrl+Space ajuda!! rsrrsrsrs
brincadeira… mas é o reset que faltou!!

Espero ter ajudado
até mais

pimentaft

Cara, não sabe o quanto me ajudou, certissimo!!!
Como é interessante este framework!!!
Qto ao crtl+space eu tenhu usado desde o inicio, e tenhu aprendido assim, procurando na internet e testando…e agora ate comprei o livro struts em ação…rsrsrsrsrsrsrs…um dia aprendo…hehehehe
Muito obrigado!!!

romuloff

[color=red]DESCRIÇÃO ERRO 1 PRA QUEM UTILIZA LAZYVALIDATORFORM[/color]

Olá

Como faz pra resolver o mesmo problema quando se está utilizando LazyForm / LazyValidatorForm ?
(Os forms não tem objetos que extendem ActionForm)

Quero fazer isso pra lazy pois aí eu posso obter o form e tudo que está nele assim:
LazyValidatorForm lazyForm = ( LazyValidatorForm ) form;
                CustoReceitaTO custoReceitaFromForm = new CustoReceitaTO();
                BeanUtils.copyProperties( custoReceitaFromForm, lazyForm );
*org.apache.commons.beanutils.BeanUtils E na minha pagina estaria assim:
<tr>
    <td align="right"><b><fmt:message key="app.gerenciaCustoReceita.label.tipoCustoReceita" />:</b></td>
    <td colspan="3"><html:select property="tipoCustoReceitaTO.tipoCustoReceitaId" style="width:281px" styleClass="box_interno">
      <html:option value="0">
        <fmt:message key="common.defaultSelect" />
      </html:option>
      <html:options collection="collectionTipoCustoReceita" property="tipoCustoReceitaId" labelProperty="descricao" />
    </html:select></td>
  </tr>
Mas não está dando por causa desse mesmo problema resolvido no tópico:
ERROR [ApplicationDispatcher.invoke():686] - Servlet.service() for servlet jsp threw exception org.apache.commons.beanutils.NestedNullException: Null property value for 'tipoCustoReceitaTO.tipoCustoReceitaId' on bean class 'class org.apache.struts.validator.LazyValidatorForm'
romuloff

[color=BLUE]SOLUÇÃO ERRO 1 PRA QUEM UTILIZA LAZYVALIDATORFORM[/color]
Consegui !

Na pagina continuei usando da mesma maneira acima e da mesma maneira que se usa quando se tem um ActionForm:
b[/b]

No Action continuei usando BeanUtils.copyProperties , assim como descrito acima.
Depois deste método todos os dados do formulario são copiados para o objeto.
Inclusive se CustoReceitaTO tiver um objeto TipoCustoReceitaTO e na pagina tiver tipoCustoReceitaTO.tipoCustoReceitaId; todos essas agregações são mantidas.

Enfim, a solução pra LazyValidatorForm é a seguinte:

/* (non-Javadoc) * @see org.apache.struts.actions.DispatchAction#dispatchMethod(org.apache.struts.action.ActionMapping, org.apache.struts.action.ActionForm, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, java.lang.String) */ @Override protected ActionForward dispatchMethod( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response, String name ) throws Exception { ActionForward dispatchActionForward = super.dispatchMethod( mapping, form, request, response, name ); LazyValidatorForm lazyForm = ( LazyValidatorForm ) form; lazyForm.set( "tipoCustoReceitaTO", new TipoCustoReceitaTO() ); lazyForm.set( "custoTO", new CustoTO() ); return dispatchActionForward; }
Mesmo que na página não exista nenhum campo direto para “tipoCustoReceitaTO” ( mas sim para seus atributos: tipoCustoReceitaTO.tipoCustoReceitaId )

romuloff

[color=red]DESCRIÇÃO ERRO 2 PRA QUEM UTILIZA LAZYVALIDATORFORM[/color]

Minha solução acima resolveu pro erro "Invalid argument looking up property"

Agora estou tendo um outro problema que quando não é LazyValidatorForm aparentemente se resolve com a solução do reset no ActionForm. (A mesma solução pro invalid ...)

Mas como estou utilizando lazyForm, gostaria muito que me ajudassem a solucionar isso: erro na pagina:
description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: BeanUtils.populate
log trace:
ERROR [StandardWrapperValve.invoke():271] - Servlet.service() for servlet action threw exception
java.lang.IllegalArgumentException: No bean specified
	at org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:874)
	at org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:933)
	at org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:830)
	at org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:433)
	at org.apache.struts.util.RequestUtils.populate(RequestUtils.java:493)

Isto acontece na requisição de um método do Action; exceto pro load que funciona (acho que o load funciona por causa da sobrescrição que fiz do dispatchMethod; mas nao sei pq os outros metodos nenhum funciona).
Resumindo, minha pagina aparece certinha no load ; mas quando clico em salvar (action=create) ou pesquisar (action=retrieve) [color=red]não cai nem na primeira linha do debug do método create e me dá esse erro colado acima ![/color]

No meu POJO existe a verificação de null no get das propriedades (se for null instancia o objeto em questao)
E no meu Action sobrescreví o dispatchMethod assim como descrito na minha resposta anterior.

Só não dá o erro se eu comento toda esta parte referente à custoTO na pagina do 'gerenciamento de custoReceitaTO':
<%-- -*-* CUSTO --%>
  <tr>
    <td colspan="4">
    <fieldset style="width: 500px"><legend><font size="1" face="Arial" color="#008000"><i>CUSTO</i></font></legend>

    <table align="center">
      <tr>
        <td align="right"><b><fmt:message key="app.gerenciaCustoReceita.label.custoValor" />:</b></td>
        <td colspan="3"><html:text property="custoTO.valor" size="50" maxlength="80" style="width:281px" styleClass="box_interno" /></td>
      </tr>

      <tr>
        <td align="right"><b><fmt:message key="app.gerenciaCustoReceita.label.custoVisivelBool" /> </b></td>
        <td colspan="3"><html:checkbox property="custoTO.visivelBool" /></td>
      </tr>
    </table>

    </fieldset>
    </td>
  </tr>
romuloff

[color=BLUE]SOLUÇÃO ERRO 2 PRA QUEM UTILIZA LAZYVALIDATORFORM[/color]

Erro acima solucionado.
Vi a solução aqui

Na verdade eu nao queria ter q criar outra tag form-bean no struts-config mas não teve outro jeito.
No form-property deste novo form-bean tb nao consegui utilizar type=“org.apache.commons.beanutils.LazyDynaBean”.

Enfim, as *modificações para solução do problema são essas:

<form-beans> <form-bean name="form" type="org.apache.struts.validator.LazyValidatorForm" /> <form-bean name="formCustoReceita" type="org.apache.struts.validator.LazyValidatorForm"> <form-property name="custoTO" type="br.com.ctbc.avalia.model.data.CustoTO" /> <!-- tentativa com lazy dyna bean sem sucesso <form-property name="custoTO" type="org.apache.commons.beanutils.LazyDynaBean" /> --> </form-bean> </form-beans>

  • alem de outra descrita acima que sem ela acho q tb nao funciona: get verificando null e criando instancia se necessario

[color=orange]PS: depois de fazer isso pude remover a sobrescrição do metodo dispatchMethod do meu Action.[/color]

.

Criado 19 de abril de 2008
Ultima resposta 9 de jun. de 2009
Respostas 6
Participantes 3