1
resposta

Como criar um Bean que converta de String para java.time.LocalDate

Durante o curso foi criado este @Bean

@Bean
    public FormattingConversionService mvcConversionService() {
        DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService();
        DateFormatterRegistrar formatterRegistrar = new DateFormatterRegistrar();
        formatterRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));
        formatterRegistrar.registerFormatters(conversionService);
        return conversionService;
    }

que consegue converter uma String para Calendar, mas não é possível converter para java.time.Localdate.

Field error in object 'locacao' on field 'dataInicio': rejected value [2017-08-03]; codes [typeMismatch.locacao.dataInicio,typeMismatch.dataInicio,typeMismatch.java.time.LocalDate,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [locacao.dataInicio,dataInicio]; arguments []; default message [dataInicio]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.time.LocalDate' for property 'dataInicio'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] for value '2017-08-03'; nested exception is java.lang.IllegalArgumentException: Parse attempt failed for value [2017-08-03]]

Vejo aí no erro de binding do formulário que existe um erro no campo da data de início em converter para o tipo [@org.springframework.format.annotation.DateTimeFormat java.time.LocalDate] . Eu dei uma lida na anotação @DateTimeFormat e diz que pode ser aplicada também a JSR-310 java.time. Can be applied to java.util.Date, java.util.Calendar, java.long.Long, Joda-Time value types; and as of Spring 4 and JDK 8, to JSR-310 java.time types too.

Eu quero passar a poder utilizar a biblioteca do Java 8 para trabalhar com datas, mas só estou com a conversão sendo feita pelo Spring utilizando campos do propriedades do tipo Calendar.

Não compreendo muito bem ainda esse método mvcConversionService() da classe de configuração da aplicação, alguém pode me dizer o que tenho que fazer para poder também converter campos do tipo da nova API de datas do java 8?

Grato.

Edit: Eu percebi que esse registrador de formato DateFormatterRegistrar só se aplica a campos do tipo Date e Calendar ( Configures basic date formatting for use with Spring, primarily for org.springframework.format.annotation.DateTimeFormat declarations. Applies to fields of type Date, Calendar and long. ).

E temos esse tipo aqui DateTimeFormatterRegistrar que Configures the JSR-310 java.time formatting system for use with Spring.. No entanto ainda estou tentando achar uma solução com isso aqui...

1 resposta

Acho que você já quase matou aí :). Você vai instanciar ele, passar o formato padrão que você quer e no fim chama chamar o regiter passando o conversionService. De todo jeito, veja também a versão do Spring que você ta usando.. de vez em quando uma simples atualização já resolve.