Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Validador está validando oque eu não pedi (sumário)

Meu fonte está idêntico ao do capítulo, no caso, quando eu preencho as informações e submeto o formulário, chega no meu controller o valor do MultipartFile sumario perfeitamente, porém, o Validator viu que minha variável sumario está nula e lançou erro, sendo q eu não implementei validação para este campo. Segue meu fonte do validator e do controller:

public class ProdutoValidation implements Validator {

    @Override
    public boolean supports(Class<?> clazz) {
        return Produto.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "titulo", "field.required");
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "descricao", "field.required");

        Produto produto = (Produto) target;
        if(produto.getPaginas() <= 0) {
            errors.rejectValue("paginas", "field.required");
        }
    }
}
@Controller
@RequestMapping(value = "/produtos")
public class ProdutosController {

    @Autowired
    private ProdutoDAO produtoDao;

    @Autowired
    private FileRecorder fileRecorder;

    @InitBinder
    public void initBinder(WebDataBinder dataBinder) {
        dataBinder.addValidators(new ProdutoValidation());
    }

    @RequestMapping(value = "/form", method = RequestMethod.GET)
    public ModelAndView form(Produto produto){
        ModelAndView modelAndView = new ModelAndView("produtos/form");
        modelAndView.addObject("tipos", TipoPreco.values());
        return modelAndView;
    }

    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView gravar(MultipartFile sumario, @Valid Produto produto, BindingResult result, RedirectAttributes redirectAttributes){
        if(result.hasErrors()) {
            return form(produto);
        }

        produto.setSumario(fileRecorder.resolveFile("arquivos-sumario", sumario));
        produtoDao.gravar(produto);
        redirectAttributes.addFlashAttribute("msgSucesso", "Produto cadastrado com sucesso!");

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

Field error in object 'produto' on field 'sumario': rejected value [org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile@654708ab]; 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]

1 resposta
solução!

A sua classe produto tem um atributo chamado sumario? Acho que o problema é esse.. pq aí vc deve ter um input file com esse nome e o Spring mvc ta tentando jogar o valor para o setter da sua classe produto. Troca o nome do parâmetro do método do controller de sumario para outra coisa...

Peguei essa msg aqui => [typeMismatch.produto.sumario,typeMismatch.sumario,typeMismatch.java.lang.String,typeMismatch]