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

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!

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();
   }
}

Explicação perfeita.

Parabens

Meu amigo, muito obrigado!