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

[ Spring ] [ dataLancamento ] Erro de validação de formatação de data no exercício de Spring

Fala, pessoal!

Já vasculhei meu código inteiro, mas não consigo encontrar o problema.

O form de cadastro de livro do projeto casadocodigo continua acusando erro de formatação de data (dd/MM/yyyy).

Mensagem de erro:

[Field error in object 'produto' on field 'dataLancamento': rejected value [15/10/2015]; codes [typeMismatch.produto.dataLancamento,typeMismatch.dataLancamento,typeMismatch.java.util.Calendar,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [produto.dataLancamento,dataLancamento]; arguments []; default message [dataLancamento]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Calendar' for property 'dataLancamento'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @org.springframework.format.annotation.DateTimeFormat java.util.Calendar for value '15/10/2015'; nested exception is java.lang.IllegalArgumentException: Unable to parse '15/10/2015']]

--

form.jsp

<form:form action="${s:mvcUrl('PC#gravar').build() }" method="post" 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>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>
        <input type="submit" value="Cadastrar" />

    </form:form>

--

ProdutosController.java

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

    @RequestMapping(method=RequestMethod.POST)
    public ModelAndView gravar(@Valid Produto produto, BindingResult validations, RedirectAttributes redirectAttributes) {

        if(validations.hasErrors()) {
            System.out.println("jader: houve erro em:");
            System.err.println(validations.getAllErrors());
            return form(produto);
        }

        produtoDao.gravar(produto);

        redirectAttributes.addFlashAttribute("sucesso", "Produto cadastrado com sucesso!");;

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

--

Produto.java

@Entity
public class Produto {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String titulo;
    private String descricao;
    private int paginas;

    @DateTimeFormat
    private Calendar dataLancamento;

--

AppWebConfiguration.java

    @Bean
    public FormattingConversionService mvcConvertionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        DateFormatterRegistrar formatterRegistrar = new DateFormatterRegistrar();
        formatterRegistrar.setFormatter(new DateFormatter("dd/MM/yyyy"));
        formatterRegistrar.registerFormatters(conversionService);

        return conversionService;
    }

--

ProdutoValidation.java

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.rejectIfEmpty(errors, "titulo", "field.required");
        ValidationUtils.rejectIfEmpty(errors, "descricao", "field.required");

        Produto produto = (Produto) target;
        if(produto.getPaginas() <= 0) {
            errors.rejectValue("paginas", "field.required");
        }
    }
}
4 respostas

Nunca mexi com Spring, mas vou dar um palpite: O que acontece se trocar o tipo do campo dataLancamento de Calendar para Date?

Talvez não aconteça nada. Mas na aula, o professor usou Calendar porque Date é mais antigo, mas obrigado pelo palpite.

solução!

Custei, mas achei a solução aqui no fórum.

O nome do método "mvcConversionService" estava errado.

https://cursos.alura.com.br/forum/topico-o-tipo-de-dado-foi-invalido-53466

Entendi. Nunca teria adivinhado. Hm. Acho que esse método deveria fazer parte de uma interface, aí não ocorreria problemas com erros de digitação no nome...