Estou recebendo uma NullPointer ao enviar o arquivo, ela acusa a linha de declaração da String do path, já verifiquei tudo varias vezes e não aparenta ter nada de errado...alguma ideia?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Estou recebendo uma NullPointer ao enviar o arquivo, ela acusa a linha de declaração da String do path, já verifiquei tudo varias vezes e não aparenta ter nada de errado...alguma ideia?
Oi Nícolas, tudo bem?
Poste seu código fonte junto ao erro, por favor.
Abraço!
Claro Otávio, ta aqui:
package br.com.nick.casadocodigo.infra;
import java.io.File;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
@Component
public class FileSaver {
@Autowired
private HttpServletRequest request;
public String fileWriter(String basePath, MultipartFile file) {
try {
String realPath = request.getServletContext().getRealPath("/" + basePath);
String path = realPath + "/" + file.getOriginalFilename();
file.transferTo(new File(path));
return basePath + "/" + file.getOriginalFilename();
} catch (IllegalStateException | IOException e) {
throw new RuntimeException(e);
}
}
}
Erro:
java.lang.NullPointerException
br.com.nick.casadocodigo.infra.FileSaver.fileWriter(FileSaver.java:22)
br.com.nick.casadocodigo.controllers.ProdutosController.confirmaProduto(ProdutosController.java:89)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.base/java.lang.reflect.Method.invoke(Method.java:564)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
O seu método fileWriter está recebendo null no parâmetro file. Posta sua classe ProdutosController para eu dar uma olhada também, por favor.
Abraço!
Desculpa os vários comments, mas primeira vez usando o Spring, só assim pra fazer sentido kkk
package br.com.nick.casadocodigo.controllers;
import java.util.List;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import br.com.nick.casadocodigo.daos.ProdutoDAO;
import br.com.nick.casadocodigo.infra.FileSaver;
import br.com.nick.casadocodigo.models.Produto;
import br.com.nick.casadocodigo.models.TipoPreco;
import br.com.nick.casadocodigo.validation.ProdutoValidation;
@Controller
@RequestMapping("/produtos")
public class ProdutosController {
/*
* injecao de dependencia, falamos pro Spring que eh dever dele instanciar e
* cuidar do objeto dao realizando assim a inversao de controle, deixando de ser
* responsabilidade do dev e passando a ser do framework
*/
@Autowired
private ProdutoDAO dao;
/*
* injeta o fileSaver para salvar um multipart file
*/
@Autowired
private FileSaver fileSaver;
// faz o biding do validator para o controller
@InitBinder
public void initBinder(WebDataBinder wdb) {
wdb.addValidators(new ProdutoValidation());
}
/*
* recebe um produto como parametro, se caso for a primeira chamada de form
* vai ter null para as Strings e 0 para as paginas sem grandes mudancas
* e caso seja acesso via redirect da validation nao perde os dados ja escritos
* corretamente
*/
@RequestMapping("form")
public ModelAndView form(Produto produto) {
/*
* passo no construtor de model and view (objeto que passa objetos de modelo
* para a view) a string a ser retornada, uso o addObject para apelidar a lista
* de valores do objeto que esta sendo passada e os respectivos valores
*/
ModelAndView modelAndView = new ModelAndView("/produtos/form");
// o Spring faz o biding da variavel com o name do form automaticamente
modelAndView.addObject("tipos", TipoPreco.values());
return modelAndView;
}
@RequestMapping(method = RequestMethod.GET) // vai para '/produtos' atraves de get
public ModelAndView listaProdutos() {
List<Produto> produtos = dao.listaProdutos();
ModelAndView modelAndView = new ModelAndView("/produtos/lista");
modelAndView.addObject("listaProdutos", produtos);
return modelAndView;
}
@RequestMapping(method = RequestMethod.POST) // vai para '/produtos' atraves de post
/*
* valid basicamente avisa que o produto eh o objeto a ser validado,
* BindingResult precisa ficar logo depois do produto como ordem de parametro e
* devolve os resultados da validation se deu algo errado ele nao persiste o
* produto
*/
public ModelAndView confirmaProduto(MultipartFile file , @Valid Produto produto, BindingResult result,
RedirectAttributes redirectAttributes) {
if (result.hasErrors()) {
return form(produto);
}
String sumarioProduto = fileSaver.fileWriter("arquivos-sumario", file);
produto.setSumarioPath(sumarioProduto);
dao.salvaProduto(produto);
System.out.println("Produto salvo com sucesso");
System.out.println(produto);
// flash atributes sempre deixam de existir após o redirect
redirectAttributes.addFlashAttribute("sucesso", "Produto salvo com sucesso");
return new ModelAndView("redirect:produtos"); // always redirect after post
}
}
poderia postar o código fonte da JSP? Só a parte do upload
Então Igor, o problema era um erro bem tonto na JSP mesmo, mas agora apesar de estar recebendo a mensagem de sucesso e o do path estar sendo salvo, o arquivo em si não vai para a pasta indicada...