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");
}
}
}