Olá pessoal!
Estou com o seguinte problema, o arquivo não é adicionado à pasta criada. Lembrando que o caminho do arquivo é persistido corretamente e a aplicação não acusa nenhum erro. Segue os fontes do meu projeto aqui:
Form
<%@ 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 lang="pt">
<head>
<meta charset="utf-8">
<title>Novo de livro - Casa do Código</title>
</head>
<body>
<form:form action="${s:mvcUrl('PC#gravar').build() }" method="post"
commandName="produto" enctype="multipart/form-data">
<label for="titulo">Título</label>
<br>
<form:input path="titulo" id="titulo" />
<form:errors path="titulo" />
<br>
<br>
<label for="descricao">Descrição</label>
<br>
<form:textarea rows="5" cols="10" path="descricao" id="descricao"></form:textarea>
<form:errors path="descricao" />
<br>
<br>
<label for="numeroDePaginas">Número de páginas</label>
<br>
<form:input type="number" min="1" path="numeroDePaginas"
id="numeroDePaginas" />
<form:errors path="numeroDePaginas" />
<br>
<br>
<label for="dataLancamento">Data de lançamento</label>
<br>
<form:input path="dataLancamento" id="dataLancamento" />
<form:errors path="dataLancamento" />
<br>
<br>
<c:forEach items="${tiposPreco}" var="tipoPreco" varStatus="status">
<label>${tipoPreco}</label>
<form:input path="precos[${status.index}].valor"/>
<form:hidden path="precos[${status.index}].tipoPreco"
value="${tipoPreco}"/>
</c:forEach>
<br>
<br>
<label for="sumario">Sumário</label>
<br>
<input type="file" name="sumario" id="sumario"/>
<br>
<br>
<form:button type="submit">Cadastrar</form:button>
</form:form>
</body>
</html>
ProdutosController
@Controller
@RequestMapping("/produtos")
public class ProdutosController {
@Autowired
private ProdutoDao dao;
@Autowired
private FileSaver fileSaver;
@InitBinder
public void InitBinder(WebDataBinder binder) {
binder.addValidators(new ProdutoValidation());
}
@RequestMapping("/form")
public ModelAndView formDeCadastroDe(Produto produto) {
ModelAndView modelAndView = new ModelAndView("/produto/formularioDeCadastro");
modelAndView.addObject("tiposPreco", TipoPreco.values());
return modelAndView;
}
@RequestMapping(method = RequestMethod.POST)
public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result) {
if (result.hasErrors())
return formDeCadastroDe(produto);
String sumarioPath = fileSaver.gravar("arquivos-sumario", sumario);
produto.setSumarioPath(sumarioPath);
dao.gravar(produto);
return new ModelAndView("/produto/produtoCadastrado");
}
@RequestMapping(method = RequestMethod.GET)
public ModelAndView listar() {
ModelAndView modelAndView = new ModelAndView("/produto/lista");
modelAndView.addObject("produtos", dao.listar());
return modelAndView;
}
}
FileSaver
@Component
public class FileSaver {
@Autowired
HttpServletRequest request;
public String gravar(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 (Exception e) {
throw new RuntimeException(e);
}
}
}
AppWebConfiguration
@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();
}
}
ServletSpringMvc
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(""));
}
}