Pessoal,
Estou tentando cadastrar uma conta-a-pagar passando o id do fornecedor (FK). Mas aparece esse erro:
javax.servlet.ServletException: javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.lang.IllegalArgumentException: No bean specified
org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:751)
org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:937)
org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Estou usando struts. Segue meu ActionForm:
public class ContaPagarForm extends ActionForm{
private ContaPagar contaPagar = new ContaPagar();
public ContaPagar getContaPagar() {
return this.contaPagar;
}
@Override
public void reset(ActionMapping map,HttpServletRequest req){
this.contaPagar = new ContaPagar();
}
}
Segue meu form:
<%@ page contentType="text/html; charset=ISO-8859-1" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<html:html>
<b>Cadastrar Conta-a-Pagar</b>
<p>
<html:form action="/cadastrarConta">
Descrição:<html:text property="contaPagar.descricao"/><br>
Valor:<html:text property="contaPagar.valor" value=""/><br>
Data:<html:text property="contaPagar.data" value=""/><br>
Pago:<html:checkbox property="contaPagar.pago" value=""/><br>
<p>
<html:hidden property="contaPagar.fornecedor.id" value="${param['fornecedor.id']}"/>
<html:submit>OK</html:submit>
</html:form>
</html:html>
Alguém tem idéia do que pode ser?
Vc já tentou fazer um debug?
Sim…o erro estoura nessa linha:
BeanUtils.copyProperties(contaPagar, ((ContaPagarForm) form).getContaPagar());
[quote=eduacsp]Sim…o erro estoura nessa linha:
BeanUtils.copyProperties(contaPagar, ((ContaPagarForm) form).getContaPagar());[/quote]
O contaPagar, que vai receber a cópia dos atributos, foi instanciado?
Outra coisa, até onde eu sei o BeanUtils.copyProperties faz uma cópia rasa, se o bean tiver outros beans dentro (ou uma Collection) alguns dados podem não ser copiados… cuidado com isso!
Sim …esta instanciado no ActionForm.
Eu tentei usar assim tb, mas não funcionou:
public class CadastrarContaPagaAction extends Action{
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
ContaPagar contaPagar = ((ContaPagarForm) form).getContaPagar();
.
.
.
return map.findForward("ok");
}
}
[quote=eduacsp]Sim …esta instanciado no ActionForm.
Eu tentei usar assim tb, mas não funcionou:
[code]
public class CadastrarContaPagaAction extends Action{
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
ContaPagar contaPagar = ((ContaPagarForm) form).getContaPagar();
.
.
.
return map.findForward("ok");
}
}
[/code][/quote]
Esperimente fazer a classe ContaPagar também extender ActionForm… só pra ver o que acontece…
[quote=eduacsp]Sim …esta instanciado no ActionForm.
Eu tentei usar assim tb, mas não funcionou:
[code]
public class CadastrarContaPagaAction extends Action{
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
ContaPagar contaPagar = ((ContaPagarForm) form).getContaPagar();
.
.
.
return map.findForward("ok");
}
}
[/code][/quote]
Nesse caso (sem usar o BeanUtils.copyProperties), qual é o erro que acontece?
[quote=Fox McCloud][quote=eduacsp]Sim …esta instanciado no ActionForm.
Eu tentei usar assim tb, mas não funcionou:
[code]
public class CadastrarContaPagaAction extends Action{
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
ContaPagar contaPagar = ((ContaPagarForm) form).getContaPagar();
.
.
.
return map.findForward("ok");
}
}
[/code][/quote]
Nesse caso (sem usar o BeanUtils.copyProperties), qual é o erro que acontece?[/quote]
javax.servlet.ServletException: javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:286)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
javax.servlet.ServletException: BeanUtils.populate
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:469)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
root cause
java.lang.IllegalArgumentException: No bean specified
org.apache.commons.beanutils.PropertyUtilsBean.getPropertyDescriptor(PropertyUtilsBean.java:751)
org.apache.commons.beanutils.BeanUtilsBean.setProperty(BeanUtilsBean.java:937)
org.apache.commons.beanutils.BeanUtilsBean.populate(BeanUtilsBean.java:811)
org.apache.commons.beanutils.BeanUtils.populate(BeanUtils.java:298)
org.apache.struts.util.RequestUtils.populate(RequestUtils.java:467)
org.apache.struts.chain.commands.servlet.PopulateActionForm.populate(PopulateActionForm.java:50)
org.apache.struts.chain.commands.AbstractPopulateActionForm.execute(AbstractPopulateActionForm.java:60)
org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304)
org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190)
org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462)
javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
Isso não faz sentido! Se nesse caso você não usou o BeanUtils.copyProperties, como pode ter ocorrido um erro no BeanUtils.populate?
Acho que por detras dos panos ele usa o BeanUtils
Dentro do ContaPagar o fornecedor está sendo corretamente declarado e instanciado?
Na verdade eu não gosto de utilizar FormBeans desse jeito!
Eu prefiro criar um ContaPagar extends ActionForm com todos os atributos do formulário da tela, de maneira simples, sem beans dentro, e depois eu copio os atributos para o meu bean ou VO!
[code]public class ContaPagarForm extends ActionForm{
private java.util.Date data;
private java.lang.String descricao;
/* Demais atributos, construtor, getters & setters… */
}
public class CadastrarContaPagaAction extends Action{
public ActionForward execute(ActionMapping map,ActionForm form,
HttpServletRequest req,HttpServletResponse res) throws Exception{
ContaPagarForm form = (ContaPagarForm) form;
ContaPagar vo = new ContaPagar();
BeanUtils.copyProperties(vo, form);
/* ... */
return map.findForward("ok");
}
}[/code]
Vc usa uma metodologia diferente. Eu uso essa já faz há algum tempo, só que nunca tinha dado esse problema.
Bom…
Então só tendo o projeto aqui pra debugar, hehehe!
Alguem tem alguma outra idéia de resolver isso?
Consegui resolver apenas adicionando essas linhas no bean do ContaPagar:
public Fornecedor getFornecedor() {
if(this.fornecedor == null) {
this.fornecedor = new Fornecedor();
}
return fornecedor;
}