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

Não executa o post

Quando eu clico em cadastrar só o input do arquivo atualiza, mas nada acontece.

@Override
    protected void customizeRegistration(Dynamic registration) {
        registration.setMultipartConfig(new MultipartConfigElement(""));
    }
@Bean
    public MultipartResolver multipartResolver(){
        return new StandardServletMultipartResolver();
    }
@RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes) {

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

        String path = fs.write("arquivos-sumario",sumario);
        produto.setSumario(path);

        produtoDAO.gravar(produto);

        redirectAttributes.addFlashAttribute("sucesso","Produto Cadastrado com sucesso");

        return new ModelAndView("redirect:produtos");
    }
@Component
public class FileSaver {

    @Autowired
    private HttpServletRequest request;

    public String write(String baseFolder, MultipartFile file) {

        try {
            String realPath = request.getServletContext().getRealPath("/" + baseFolder);
            String path = realPath + "/" + file.getOriginalFilename();
            file.transferTo(new File(path));

            return baseFolder + "/" + file.getOriginalFilename();

        } catch (Exception e) {
            throw new RuntimeException(e);
        }

    }
}
5 respostas
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="s" uri="http://www.springframework.org/tags" %>
<%--
  Created by IntelliJ IDEA.
  User: BielM
  Date: 08/07/2020
  Time: 18:05
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<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>Data de Lançamento</label>
        <form:input path="dataLancamento"/>
        <form:errors path="dataLancamento"/>
    </div>
    <div>
        <label>Páginas</label>
        <form:input path="paginas" />
        <form:errors path="paginas"/>
    </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>Sumário</label>
        <input name="sumario" type="file"/>
    </div>

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

Olá Gabriel, bom dia.

Aparece alguma mensagem de erro no console do Eclipse?

Tente executar o servidor em modo debug e coloque um breakpoint nesse trecho:

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

Você tem que se atentar ao tamanho da string no campo descrição e formatação nos campos de valores, vírgula no lugar de ponto.

Não utilize 19,90, tente 19.90 ou apenas 19, por exemplo.

Tá dando esse erro:

org.springframework.validation.BeanPropertyBindingResult: 1 errors Field error in object 'produto' on field 'sumario': rejected value [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@1e83ad3c]; codes [typeMismatch.produto.sumario,typeMismatch.sumario,typeMismatch.java.lang.String,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [produto.sumario,sumario]; arguments []; default message [sumario]]; default message [Failed to convert property value of type 'org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile' to required type 'java.lang.String' for property 'sumario'; nested exception is java.lang.IllegalStateException: Cannot convert value of type [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile] to required type [java.lang.String] for property 'sumario': no matching editors or conversion strategy found]

Cara,

em ProdutoController os imports são esses?

import org.springframework.web.multipart.MultipartFile;
import.org.springframework.web.multipart.support.StandardServletMultipartResolver;

em ServeletSpringMVC os imports são esses?

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration.Dynamic;
solução!

O problema é que no meu produto, eu coloquei o atributo como sumario e o spring estava tentando popular com o MultipartFile esse atributo.