Erro com construtor (Vraptor)

6 respostas
slashfox

Seguinte, eu tenho uma classe Produto, outra ProdutoController e um formulário (jsp) para popular um objeto.
Minha classe Produto tá assim:

public class Produto {

private Long id;

private String nome;

private String descricao;

private Double preco;

private List list;
public Produto(){
    this.preco = 199.;
    this.list = new ArrayList<Produto>();
}
.
.
. //setters e getters dos atributos.
.

}

Para o meu ProdutoController eu tenho:

private static Produto p = new Produto();

private final Result result;

.

.

.

}

o formulário possui produto.nome, produto.descrição, produto.preco o que eu não preencho fica null depois (como eu já conferi).

O problema está quando eu altero o construtor do Produto para:

public Produto(String nome){

this.nome = nome //(tanto faz essa linha ou nao)

this.preco = 199.;

this.list = new ArrayList();

}

Daí dá o seguinte erro ( não vou colocar todo o erro, ele eh dividido em 2 entao acho que colocando um pouco de cada um dá pra alguém que entende ver o problema.)

br.com.caelum.vraptor.http.InvalidParameterException: Unable to find the correct constructor

br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:98)

ognl.ASTProperty.getValueBody(ASTProperty.java:118)

ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

ognl.SimpleNode.getValue(SimpleNode.java:236)

ognl.ASTChain.setValueBody(ASTChain.java:222)

ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)

ognl.SimpleNode.setValue(SimpleNode.java:279)

ognl.Ognl.setValue(Ognl.java:737)

ognl.Ognl.setValue(Ognl.java:783) 




root cause

java.lang.NoSuchMethodException: br.com.caelum.goodbuy.modelo.Produto.()

java.lang.Class.getConstructor0(Class.java:2706)

java.lang.Class.getDeclaredConstructor(Class.java:1985)

br.com.caelum.vraptor.http.ognl.GenericNullHandler.instantiate(GenericNullHandler.java:70)

br.com.caelum.vraptor.http.ognl.ReflectionBasedNullHandler.nullPropertyValue(ReflectionBasedNullHandler.java:79)

ognl.ASTProperty.getValueBody(ASTProperty.java:118)

ognl.SimpleNode.evaluateGetValueBody(SimpleNode.java:212)

ognl.SimpleNode.getValue(SimpleNode.java:236)

ognl.ASTChain.setValueBody(ASTChain.java:222)

ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:220)

ognl.SimpleNode.setValue(SimpleNode.java:279)

ognl.Ognl.setValue(Ognl.java:737)

ognl.Ognl.setValue(Ognl.java:783)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createViaOgnl(OgnlParametersProvider.java:132)

br.com.caelum.vraptor.http.ognl.OgnlParametersProvider.createRoot(OgnlParametersProvider.java:108)




alguém pra dar uma luz?
ficaria muito grato.

6 Respostas

Vmaia

Posta tuas classes :smiley:

balrog

altere seu controler para chamar o construtor correto da sua classe produto.

slashfox

Então… o meu controller já está chamando o construtor correto, mas o que aparenta eh que esse construtor não pode ter nenhum parâmetro.
É essa a questão, o contrutor de qualquer objeto atributo no controller (repare que não estou falando do constutor do próprio controller) não pode ter argumentos?

balrog

vc nao diz ter alterado o construtor da classe produto para receber o nome? baseado no codigo postado seu controler continua chamando o construtor sem passar o att nome, isso nao vai funcionar nem aqui nem na china. Ou vc altera seu controller passando nome, ou add outro construtor em produto que nao receba parametro nenhum.

slashfox

Esqueci de dizer que quando eu altero o construtor do produto para receber uma String no parâmetro eu adiciono o mesmo no produto do ProdutoController.
Mesmo assim, obrigado pela atenção.

slashfox

public class Produto {

private Long id;
private String nome;
private String descricao;
private Double preco;
private List<Produto> list;


public Produto(){                                               [b][color=red]public Produto(String nome)[/color]{ [/b]
    this.preco = 199.;                                                                        [b]this.preco = 199.;[/b]
    this.list = new ArrayList<Produto>();                                    [b] this.list = new ArrayList<Produto>();[/b]
}                                                                         [b]}[/b]

public List<Produto> getList() {
    return list;
}

public void setList(List<Produto> list) {
    this.list = list;
}

public void setDescricao(String descricao) {
    this.descricao = descricao;
}

public void setId(Long id) {
    this.id = id;
}

public void setNome(String nome) {
    this.nome = nome;
}

public void setPreco(Double preco) {
    this.preco = preco;
}

public String getDescricao() {
    return descricao;
}

public Long getId() {
    return id;
}

public String getNome() {
    return nome;
}

public Double getPreco() {
    return preco;
}

}


@Resource
public class ProdutosController {

private static Produto p = new Produto();             [b][color=red]private static Produto p = new Produto("teste");[/b][/color]
//private final ProdutoDao dao;
private final Result result;

    public ProdutosController( Result result) {
    this.result = result;
}

@Path("/ttt")
public String lista() {
    System.out.println(p.getNome());
    return this.p.getList().toString();
}

public void adiciona(Produto produto){
    p.getList().add(produto);
    result.redirectTo(ProdutosController.class).lista();
}

public Produto edita(Long id){
//        return dao.carrega(id);

return this.p;

}
public void altera(Produto produto){
//      dao.atualiza(produto);

result.redirectTo(ProdutosController.class).lista();

}

public void formulario(){
}

}

o que está de vermelho é o que eu altero.

Observe que mesmo colocando uma String no parâmetro do cosntrutor, eu nem sequer utilizo esse parâmetro.

Criado 11 de junho de 2010
Ultima resposta 11 de jun. de 2010
Respostas 6
Participantes 3