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]