Java.lang.IllegalArgumentException: No bean specified

15 respostas
J

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?

15 Respostas

F

Vc já tentou fazer um debug?

J

Sim…o erro estoura nessa linha:
BeanUtils.copyProperties(contaPagar, ((ContaPagarForm) form).getContaPagar());

F

eduacsp:
Sim…o erro estoura nessa linha:
BeanUtils.copyProperties(contaPagar, ((ContaPagarForm) form).getContaPagar());

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!

J

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");

		
	}

}
F
eduacsp:
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");

		
	}

}
Esperimente fazer a classe ContaPagar também extender ActionForm... só pra ver o que acontece...
J

mesmo erro :frowning:

F
eduacsp:
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");

		
	}

}
Nesse caso (sem usar o BeanUtils.copyProperties), qual é o erro que acontece?
J
Fox McCloud:
eduacsp:
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");

		
	}

}
Nesse caso (sem usar o BeanUtils.copyProperties), qual é o erro que acontece?
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)

F

Isso não faz sentido! Se nesse caso você não usou o BeanUtils.copyProperties, como pode ter ocorrido um erro no BeanUtils.populate?

J

Acho que por detras dos panos ele usa o BeanUtils

F
eduacsp:
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!

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");   
  
           
    }   
  
}
J

Vc usa uma metodologia diferente. Eu uso essa já faz há algum tempo, só que nunca tinha dado esse problema.

F

Bom…

Então só tendo o projeto aqui pra debugar, hehehe!

:stuck_out_tongue:

J

Alguem tem alguma outra idéia de resolver isso?

J

Consegui resolver apenas adicionando essas linhas no bean do ContaPagar:

public Fornecedor getFornecedor() {
		if(this.fornecedor == null) {
			this.fornecedor = new Fornecedor();		
		}
		return fornecedor;
	}
Criado 17 de julho de 2008
Ultima resposta 17 de jul. de 2008
Respostas 15
Participantes 2