Boa tarde, galera!
Estou com um problema ao selecionar um arquivo pelo <input type="file" name="sumario"/>
e clicar no botão de submit da página "form.jsp".
O que acontece após submeter o formulário é que o argumento MultipartFile sumario
chega nulo na chamada do método gravar
.
Além disso, a partir do momento que incluo o MultipartFile sumario
na assinatura do método gravar, o bindingResult.hasErrors()
retorna true
e acusa erros em todos os campos da tela, como se não estivessem preenchidos.
Meus fontes:
ProdutoController.java
@RequestMapping(method=RequestMethod.POST)
public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult bindingResult, RedirectAttributes redirectAttributes) {
if (bindingResult.hasErrors()) {
return new ModelAndView("produtos/form");
}
System.out.println(sumario.getOriginalFilename());
dao.gravar(produto);
redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");
return new ModelAndView("redirect:/produtos");
}
form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ 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" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Cadastro de Produtos</title>
</head>
<body>
<form:form action="${s:mvcUrl('PC#gravar').build()}" method="post" enctype="multipart/form-data" commandName="produto">
<div>
<label>
Titulo:
</label>
<form:input path="titulo"/>
<form:errors path="titulo" />
</div>
<div>
<label>
Descrição:
</label>
<form:textarea path="descricao" rows="10" cols="20"/>
<form:errors path="descricao" />
</div>
<div>
<label>
Número de páginas:
</label>
<form:input path="paginas"/>
<form:errors path="paginas" />
</div>
<div>
<label>Data de Lançamento:</label>
<form:input path="dataLancamento"/>
<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:hidden path="precos[${status.index}].tipo" value="${tipoPreco}"/>
</div>
</c:forEach>
<div>
<label>Arquivo:</label>
<input type="file" name="sumario"/>
</div>
<button type="submit">Cadastrar o produto</button>
</form:form>
</body>
</html>
ServletSpringMvc.java
package br.com.casadocodigo.loja.conf;
import javax.servlet.Filter;
import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ServletSpringMvc extends AbstractAnnotationConfigDispatcherServletInitializer{
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] {AppWebConfiguration.class, JPAConfiguration.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
encodingFilter.setEncoding("UTF-8");
return new Filter[] {encodingFilter};
}
@Override
protected void customizeRegistration(Dynamic registration) {
registration.setMultipartConfig(new MultipartConfigElement(""));
}
}
AppWebConfiguration.java
package br.com.casadocodigo.loja.conf;
import org.springframework.context.MessageSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.format.datetime.DateFormatter;
import org.springframework.format.datetime.DateFormatterRegistrar;
import org.springframework.format.support.DefaultFormattingConversionService;
import org.springframework.format.support.FormattingConversionService;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import br.com.casadocodigo.loja.controllers.HomeController;
import br.com.casadocodigo.loja.daos.ProdutoDAO;
import br.com.casadocodigo.loja.infra.FileSaver;
@EnableWebMvc
@ComponentScan(basePackageClasses={HomeController.class, ProdutoDAO.class, FileSaver.class})
public class AppWebConfiguration {
@Bean
public InternalResourceViewResolver internalResourceViewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("/WEB-INF/messages");
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(1);
return messageSource;
}
@Bean
public FormattingConversionService mvcConversionService() {
DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
DateFormatterRegistrar registra = new DateFormatterRegistrar();
registra.setFormatter(new DateFormatter("dd/MM/yyyy"));
registra.registerFormatters(conversionService);
return conversionService;
}
@Bean
public MultipartResolver multipartResolver() {
return new StandardServletMultipartResolver();
}
}
Agradeço se alguém puder me ajudar!