Java.lang.IllegalArgumentException: No bean specified

Pessoal,

Estou tentando cadastrar uma conta-a-pagar passando o id do fornecedor (FK). Mas aparece esse erro:

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…

mesmo erro :frowning:

[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]

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!

:stuck_out_tongue:

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