Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

tome null pointer

Boa tarde senhores,

Estou tomando um null pointer no terceiro exercício da aula 9.

durante a aula o intrutor toma esse mesmo nullPointer so q em seguida ele implementa alguns métodos e tudo funciona. ja implementei os métodos conforme é proposto na aula e continuo na mesma.

O desafio é receber arquivos no servidor através e um "input file" do formulário recebendo um MultPartFile.

Configuração no AppWebConfigurarition implementando um resolvedor para o multpartfile:

    @Bean
    public MultipartResolver multipartResolver() {
        return new StandardServletMultipartResolver();
    }

Configuração do no ServletConfiig:

    @Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement(""));
    }

Metodo do controller que atende ao request do formulário:

@RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult bindingResult,
            RedirectAttributes redirectAttributes) {

        System.out.println(sumario.getOriginalFilename());

        if (bindingResult.hasErrors()) {
            return form(produto);
        }

        produtoDao.grava(produto);
        System.out.println(produto.getPrecos());
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso");

        return new ModelAndView("redirect:produtos");
    }

Obs: nesse método "gravar" do controller, se eu colocar o sysout que chama o sumario depois do if que faz a validação do binding, o codigo entra nesse if e me retorna a pag do formulário novamente se eu coloco o sysout antes do if ele me devolver um nullpointer exception na linha 49 que é a linha onde esta esse sysout .

7 respostas

Opa, vc trocou o enctype do form? o nome do input ta correto?

Pior que sim, ja verifiquei o enctype e o nome do input antes de vir aqui:


<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<%@ taglib uri="http://www.springframework.org/tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
    <h1>FORM</h1>

    <form:form action="${s:mvcUrl('PC#gravar').build()}" method="post"
        commandName="produto" enctype="multipart/form-data">
        <div>
            <label>Título</label>
            <form:input path="titulo" />
            <form:errors path="titulo" />
        </div>
        <div>
            <label>Descrição</label>
            <form:textarea rows="10" cols="20" path="descricao" />
            <form:errors path="descricao" />
        </div>
        <div>
            <label>Páginas</label>
            <form:input path="paginas" />
            <form:errors path="paginas" />
        </div>
        <div>
            <label>Data de lançamento</label> <input name="dataLancamento"
                type="text" />
            <form:errors path="dataLancamento" />
        </div>

        <c:forEach items="${tipos}" var="tipoPreco" varStatus="status">
            <div>
                <label>${tipoPreco}</label>
                <form:input path="precos[${status.index}].valor" />
                <form:input type="hidden" path="precos[${status.index}].tipo"
                    value="${tipoPreco}" />
            </div>
        </c:forEach>

        <div>
            <label>Sumário</label> <input type="file" name="sumarioPath" />
        </div>

        <button type="submit">Cadastrar</button>
    </form:form>

</body>
</html>

meu modelo de produto tmbm:

package br.com.casadocodigo.models;

import java.util.Calendar;
import java.util.List;

import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

import org.springframework.format.annotation.DateTimeFormat;

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String titulo;
    private String descricao;
    private int paginas;

    @ElementCollection
    private List<Preco> precos;

    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private Calendar dataLancamento;

    private String sumarioPath;

    public int getId() {
        return id;
    }

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

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getDescricao() {
        return descricao;
    }

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

    public int getPaginas() {
        return paginas;
    }

    public void setPaginas(int paginas) {
        this.paginas = paginas;
    }

    public List<Preco> getPrecos() {
        return precos;
    }

    public void setPrecos(List<Preco> precos) {
        this.precos = precos;
    }

    public Calendar getDataLancamento() {
        return dataLancamento;
    }

    public void setDataLancamento(Calendar dataLancamento) {
        this.dataLancamento = dataLancamento;
    }

    public String getSumarioPath() {
        return sumarioPath;
    }

    public void setSumarioPath(String sumarioPath) {
        this.sumarioPath = sumarioPath;
    }

    @Override
    public String toString() {
        return "Produto [id=" + id + ", titulo=" + titulo + ", descricao=" + descricao + ", paginas=" + paginas
                + ", precos=" + precos + "]";
    }

}

O nome do seu input é sumarioPath e o argumento do seu método é sumario. Acho que o problema ta aí.

Alberto, realmente estava diferente, mas na explicação da aula o instrutor passa da forma q eu tinha feito e no dele funcionava.

enfim, agora que eu alterei o nome do argumento do método igual o do input , eu estou conseguindo receber o nome do MultParFile como esperado.

mas se eu deixo o código do meu controller assim:

@RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumarioPath, @Valid Produto produto, BindingResult bindingResult,
            RedirectAttributes redirectAttributes) {

        System.out.println(sumarioPath.getOriginalFilename());

        if (bindingResult.hasErrors()) {
            return form(produto);
        }

        produtoDao.grava(produto);
        System.out.println(produto.getPrecos());
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso");

        return new ModelAndView("redirect:produtos");
    }

ele retorna o nome do meu arquivo no console,

mas se eu deixar assim, que é a forma que esta no exercício:

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumarioPath, @Valid Produto produto, BindingResult bindingResult,
            RedirectAttributes redirectAttributes) {

        if (bindingResult.hasErrors()) {
            return form(produto);
        }

        System.out.println(sumarioPath.getOriginalFilename());

        produtoDao.grava(produto);
        System.out.println(produto.getPrecos());
        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso");

        return new ModelAndView("redirect:produtos");
    }

Ele não faz nada, acredito que ele entre naquele if e vê que tem um erro de validação por ele n saber oq fazer com o MultPartFile recebido, mas a questão é que se eu faço do jeito que o exercício pede não esta funcionando.

teria alguma explicação ?

Alguem pra ajudar ?

solução!

E aí Julio blz? Cara dá um olhada nessa solução, talvez possa te ajudar: https://cursos.alura.com.br/forum/topico-aula-09-filepath-nao-e-inserido-e-form-nao-redireciona-33797

Acho que você já achou um possível problema.. tem que debugar e ver se ta entrando no if.. se tiver, invoca o método getAllErrors do bindingResult e verifica o que houve.