Sub-property em form com struts [ R E S O L V I D O ]

3 respostas
T

Caros amigos,

Estou tentando fazer um formulário no struts como ex. abaixo

public class Usuario {

private String nome;

private Endereco endereco;

// …getters n’ setters

}
public class Endereco {

private int id;

private String rua;

private String cep;

// …getters n’ setters

}

<html:form action=/teste.do>
nome <html:text property=“nome”/>
endereco id <html:text property=“endereco.id”/>
</html:form>

Quando o faço o submit deste form recebo a exceção:

javax.servlet.ServletException: BeanUtils.populate
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1254)
	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause


java.lang.IllegalArgumentException: No bean specified
	org.apache.commons.beanutils.PropertyUtils.getPropertyDescriptor(PropertyUtils.java:837)
	org.apache.commons.beanutils.BeanUtils.setProperty(BeanUtils.java:934)
	org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:808)
	org.apache.struts.util.RequestUtils.populate(RequestUtils.java:1252)
	org.apache.struts.action.RequestProcessor.processPopulate(RequestProcessor.java:821)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:254)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

Isso acontece por causa da propriedade endereco.id gostaria de saber como posso popular tal propriedade. Acreditei que a taglib nested fosse para tal propósito, mas não funcionou

nota: Eu ja instanciei o objeto Endereco do bean.

Grato pela atenção!

3 Respostas

T

Caros amigos,

Depois de uma semana de pesquisas e muiiiiitas tentativas, encontrei o problema e as soluções possiveis. Faço questão de compartilhar com todos pois encontrie muitas pessoas com o mesmo problema principalmente em forums internacionais. Sem mais…

:arrow: Problema:
Minha classe Pessoa que contem o objeto Endereço aninhado, não cria uma instancia deste na declaração apenas o declara:

=> private Endereco endereco; // Só declarado
=> private Endereco endereco = new Endereco(); // Instanciando

Quando um JSP dispara um submit para um Action o Struts cria uma nova instância do FormBean associado a Action, no caso Pessoa.
Devido ao objeto aninhado endereco estar apenas declarado, quando o Strus cria uma nova instância da classe Usuario este é null contudo ocorre o erro durante a população do Bean.

:arrow: Soluções

1a. Ao invés de somente declarar, instanciar o objeto aninhado na declaração ou no construtor como preferir.

2a. Um dos metódos herdados da classe ActionForm de qual todos os FormBean são sub-classe, reset(ActionMapping mapping, HttpServletRequest request) é executado todas as vezes depois que um FormBean é instanciado. Então podemos instanciar o nosso objeto aninhado neste método e manter nosso objeto aninhado somente declarado, BINGO :idea:

ex.:

public class Usuario {
   private String nome; 
   private Endereco endereco;
   // ...getters n' setters
   
   reset(ActionMapping mapping, javax.servlet.http.HttpServletRequest request) {
     endereco = new Endereco();
   }
}
G

Explicação perfeita.

Parabens

Michnnick

Meu amigo, muito obrigado!

Criado 31 de março de 2006
Ultima resposta 11 de dez. de 2012
Respostas 3
Participantes 3