Dúvida na inserção

Boa noite pessoal, estou desenvolvendo um ecommerce pra trabalho de faculdade e estou com uma dúvida ao inserir um campo que será chave estrangeira.
Tenho uma classe produto e uma categoria. No caso a classe produto possui código da categoria como chave estrangeira. Estou tentando fazer a inserção no banco porém ocorre o segu erro

[code]type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.NullPointerException
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:520)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:427)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
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:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.NullPointerException
struts.action.ProdutoAction.execute(ProdutoAction.java:60)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
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:637)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.

[/code]

O meu código da classe CategoriaAction é


public class CategoriaAction extends Action {
    public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request,
            HttpServletResponse response) throws Exception{

        HttpSession session = request.getSession();
        CategoriaForm categoriaForm = (CategoriaForm)form;

        Categoria categoria = new Categoria();
        categoria.setCod_Categ(Integer.parseInt(categoriaForm.getCodigo()));
        categoria.setDescricao(categoriaForm.getDescricao());
        categoria.setNome(categoriaForm.getNome());

        CategoriaDao dao = new CategoriaDao();
        dao.create(categoria);
        session.setAttribute("categoria", categoria);


        return mapping.findForward("categoria");

    }


}

e da classe ProdutoAction

public class ProdutoAction extends Action{
public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request,
            HttpServletResponse response) throws Exception{

        HttpSession session = request.getSession();
        ProdutoForm produtoForm = (ProdutoForm)form;

        
        Produto produto = new Produto();
        produto.setCod_Prod(Integer.parseInt(produtoForm.getCodigo()));
        produto.setNome(produtoForm.getNome());
        produto.setDescricao(produtoForm.getDescricao());
        produto.setQtd_Estoque(Integer.parseInt(produtoForm.getQtdEstoque()));
        produto.setValor(Double.parseDouble(produtoForm.getPrecoUnit()));
        produto.setValor(Double.parseDouble(produtoForm.getPrecoPromocional()));
        produto.getCod_Categ().setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));


        ProdutoDao dao = new ProdutoDao();
        dao.create(produto);
        session.setAttribute("produto", produto);


        return mapping.findForward("produto");

    }

}
}

Esse erro da linha 60 é da seguinte linha

produto.getCod_Categ().setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));

Alguém saberia me dizer o pq?

Obrigada

Não seria?

produto.setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));

Ou dependendo como estiver na classe (atributo CodCateg ou codCateg, confirme como está na classe):

produto.setCodCateg(Integer.parseInt(produtoForm.getCodCateg()));

Então Guevara,

O meu atributo categoria na classe Produto está declarado da seguinte forma

 private Categoria cod_Categ 

Por esse motivo não consigo =/

Se é do tipo Categoria, então precisa instanciar Categoria e inserir:

Categoria categoria = new Categoria()
Produto produto = new Produto();
//outros inserts
categoria.setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));

Veja se resolve.
falha minha
O seu caso é um @OneToMany, um produto está em apenas uma categoria e uma categoria em vários produtos, confere o link que têm exemplos:
http://www.hiberbook.com/HiberBookWeb/learn.jsp?tutorial=18mappingonetomanyassociations

Boa madrugada Colegas !

Amigo… melhor postar os códigos das classes Produto e Categoria.

Porque, analisando esta linha do erro,
produto.getCod_Categ().setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));

me parece que o produto.getCod_Categ retorna uma Categoria e dai você faz um Categoria.setCod_Categ, então se ao criar um Produto você não cria uma Categoria o seu atributo Cod_Categ (que é uma Categoria) estará nulo…

Nossa, como ficou confuso !

Uma dica… você não deveria criar um atributo chamado Cod_categ quando ele é uma Categoria…nem um método getCod_categ que retorna uma Categoria… não acha mais claro algo como:

//na classe Produto
private Categoria categoria;

public Categoria getCategoria() {
          return this.categoria;
}

public void setCategoria(Categoria categoria) {
          this.setCategoria = categoria;
}

[]s

Oi Zeed01
Realmente ficou um pko confuso…
Deve ser pq ainda é madrugada…rsrs

Mas então, as minhas classes produtos e categorias estão da seguinte forma

CATEGORIA

public class Categoria {
	
	private int codCateg;
	private String descricao;
	private String nome;
	
	public int getCodCateg() {
		return codCateg;
	}
	public void setCodCateg(int codCateg) {
		this.codCateg = codCateg;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	
	

}

PRODUTO


public class Produto {
	
	private int codProduto;
	private double valorProduto;
	private double valorPromocional;
	private String descricao;
	private int quantidade;
	private Categoria codCategoria;
	public int getCodProduto() {
		return codProduto;
	}
	public void setCodProduto(int codProduto) {
		this.codProduto = codProduto;
	}
	public double getValorProduto() {
		return valorProduto;
	}
	public void setValorProduto(double valorProduto) {
		this.valorProduto = valorProduto;
	}
	public double getValorPromocional() {
		return valorPromocional;
	}
	public void setValorPromocional(double valorPromocional) {
		this.valorPromocional = valorPromocional;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public int getQuantidade() {
		return quantidade;
	}
	public void setQuantidade(int quantidade) {
		this.quantidade = quantidade;
	}
	public Categoria getCodCategoria() {
		return codCategoria;
	}
	public void setCodCategoria(Categoria codCategoria) {
		this.codCategoria = codCategoria;
	}
	
	

}

Como você pode verificar, no Produto o id da Categoria é passado como Categoria mesmo.
Tanto é que com select ele funciona, mas quando é o insert não. Não to entendendo o pq =S

Para facilitar, separa a linha

produto.getCod_Categ().setCod_Categ(Integer.parseInt(produtoForm.getCodCateg())); 

em várias assim poderemos ver ao certo qual referência está null.

Na classe Produto que você postou, cadê o método getCod_Categ ?

fvslistas
Não entendi
O que você diz com separar a linha em várias?
Poderia me explicar melhor???

Guevara
Não tinha visto sua ultima mensagem.
Eu tinha tentado instanciar mas de uma forma diferente, vou tentar dessa forma.
=]

Bom dia Galera !

Acho que ele quis dizer alguma coisa mais ou menos assim:

Categoria c = new Categoria();

c = produto.getCod_Categ();
c.setCod_Categ(Integer.parseInt(produtoForm.getCodCateg());

produto.setCod_Categ(c);

Ou algo assim…

[]s

Ahh
Entendi Zeed01.

Infelizmente eu deixei meu pen drive em casa com a aplicação, mas assim que chegar em casa testo e informo…
=]

Por hora, OBrigadaaaaa!!!

Foi isso mesmo que eu quis dizer.
Valeu Zeed01.

E dsystem, fica ligado que vc postou dois códigos aparentemente incompatíveis.

Dentro de ProdutoAction vc chama produto.getCod_Categ().
Mas em Produto não há método produto.getCodCategoria() e sim produto.getCod_Categoria()

Acho que vc alterou seu código entre um post e outro.

Então fvslistas
Eu coloquei assim pq minha professora me ensinou da seguinte forma(se estiver errado por favor me explica o certo =])
Aplicação WEB:
Quando eu fizer a Action, nesse caso ProdutoAction, eu tenho que declarar as variáveis com o mesmo nome que eu tenho no meu jsp, no caso no jsp está como cod_categoria, mas ela falou que o nome do Action não precisa ser igual ao da classe.
Então dessa forma que ela me explicou está incorreto?
Eu tenho que fazer o do Action do mesmo modo que o da classe?

Desculpe…

Mas na ultima mensagem eu não passei nada para testar não, rs.

Só tentei explicar o que o outro colega queria dizer com quebrar em varias linhas.

Mas acho que tem outro problema na sua implementação…
Veja só:

a linha que esta dando erro é esta:

produto.getCod_Categ().setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));

Pelo seu código, na classe Produto, não existe o metodo getCod_Categ, não sei se você passou a versão correta, porque nesse caso você teria erro ja na compilação.

Eu acho que o erro esta mesmo no fato de que você não esta tentando setar o id da Categoria sem ter antes criado uma categoria e setado em produto.
Então acho que o codigo teria que ser:


Categoria c = new Categoria();
c.setCodCateg(Integer.parseInt(produtoForm.getCodCateg()); 

produto.setCodCategoria(c);

[]s

Entao Zeed01

Como disse na msg acima, eu fiz conforme a professora explicou… Eu achei estranho, pq ela me disse que não precisaria ter o mesmo nome entendeu??
Por isso fiz dessa forma…
Declarei de uma forma em Produto e de outra forma no ProdutoAction… como perguntei acima, a forma correta então seria eu declarar da mesma forma tanto no produto quanto no produtoaction?

Desculpas por fazer tanta pergunta, mas é que como estou no começo; não tenho quase noção de java web, e aqui é o unico lugar que vocês explicam direitinho e me faz entender =]

Obrigada

Olá pessoal

Então, fiz todas as alterações…Deixei tudo igual mas continua o mesmo erro…

O erro continua mostrando que essa linha

c.setCod_Categ(Integer.parseInt(produtoForm.getCodCateg()));
O valor setado é null =S

Mas alguma sugestão??

Bom dia Galera !

dsystem, aparentemente vc esta tentando setar um valor nulo para c.setCod_Categ.

Sugiro que de um print para ver o que tem em produtoForm.getCodCateg.

Já postou o código de produtoForm ?

[]s

BOm dia Galera,

Então Zeed01,

O código do produtoForm é o seguinte

public class ProdutoForm extends ActionForm {
    private String nome;
    private String codigo;
    private String descricao;
    private String precoUnit;
    private String precoPromocional;
    private String codCateg;
    private String qtdEstoque;

    public String getCodCateg() {
        return codCateg;
    }

    public void setCodCateg(String codCateg) {
        this.codCateg = codCateg;
    }

   

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getDescricao() {
        return descricao;
    }

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

    public String getNome() {
        return nome;
    }

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

    public String getPrecoPromocional() {
        return precoPromocional;
    }

    public void setPrecoPromocional(String precoPromocional) {
        this.precoPromocional = precoPromocional;
    }

    public String getPrecoUnit() {
        return precoUnit;
    }

    public void setPrecoUnit(String precoUnit) {
        this.precoUnit = precoUnit;
    }

    public String getQtdEstoque() {
        return qtdEstoque;
    }

    public void setQtdEstoque(String qtdEstoque) {
        this.qtdEstoque = qtdEstoque;
    }
    
    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request){
         ActionErrors erros = new ActionErrors();
         if(codigo == null)
             erros.add("codigo.erro",new ActionMessage("Código inválido"));
         return erros;
    }
}

Boa tarde Galera !

Então o valor seu produtoForm na verdade é o form que vem no método Action do seu ProdutoAction:

ProdutoForm produtoForm = (ProdutoForm)form;

Bom, eu acho que se esta dando mensage de null, você tem que em algum lugar ai colocar um print pra ver o que tem em produtoForm.getCodCateg.

Qual a mensagem de erro que esta dando agora ?
Como ficou sem código afinal ?

[]s