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

Problemas com LocalDate

Tenho um crud onde preciso adicionar a data de nascimento da pessoa. Porém ao salvar recebo o erro:

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDate` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling
 at [Source: UNKNOWN; byte offset: #UNKNOWN] (through reference chain: br.com.nsistemas.back.agendo.DTO.PessoaDTO["dataNascimento"])

Minha entidade pessoa esta assim:

public class Pessoa {

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

    private String nome;
    private String nomeSocial;
    private LocalDate dataNascimento;
    private String cpf;
    private String rg;
    private String email;
    private String telefone;
    private boolean whats;
    private String nomePai;
    private String nomeMae;
    private String sexo;

    @Embedded
    private Endereco endereco;

No meu DTO esta assim:

public record PessoaDTO(
        Long id,
        @NotBlank(message = "O nome é obrigatório.")
        String nome,
        String nomeSocial,
        @JsonFormat(pattern = "yyyy-MM-dd")
        LocalDate dataNascimento,

observei em pesquisas para adicionar a dependencia

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.13.0</version> <!-- Versão mais recente no momento do seu projeto -->
        </dependency>

e criar as configurações:

@Configuration
public class JacksonConfig {

    @Bean
    public Jackson2ObjectMapperBuilder objectMapperBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.modulesToInstall(new JavaTimeModule());
        return builder;
    }
}
@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json()
                .modules(new JavaTimeModule())
                .build();

        converters.add(new MappingJackson2HttpMessageConverter(objectMapper));
    }
}

mesmo com tudo isso ainda recebo esta exceção. Como resolver? A titulo de informação, uso angular, o meu método de salvar no front esta assim:

salvar() {
        if (this.formulario.valid) {
            this.removerMascaras();

            const dadosFormulario = this.formulario.value;
            const dataNascimentoFormatada = this.formatarDataParaJSON(dadosFormulario.dataNascimento);

            this.pessoa = {
                id: null,
                nome: dadosFormulario.nome,
                nomeSocial: dadosFormulario.nomeSocial,
                dataNascimento: dataNascimentoFormatada,
                cpf: dadosFormulario.cpf,
                rg: dadosFormulario.rg,
                email: dadosFormulario.email,
                telefone: dadosFormulario.telefone,
                whats: dadosFormulario.whats,
                nomeMae: dadosFormulario.nomeMae,
                nomePai: dadosFormulario.nomePai,
                sexo: dadosFormulario.sexo.nome,

                endereco: {
                    logradouro: dadosFormulario.logradouro,
                    bairro: dadosFormulario.bairro,
                    numero: dadosFormulario.numero,
                    cidade: dadosFormulario.cidade,
                    cep: dadosFormulario.cep,
                    uf: dadosFormulario.estado.nome,
                    complemento: '',
                },
            };
            console.log('Data formatada para o backend:', dataNascimentoFormatada);

            this.service.salvarPessoa(this.pessoa).subscribe((resposta) => {
                if (resposta) {
                    this.showSucesso();
                } else {
                    this.showError();
                }
            });
        }
    }


    private formatarDataParaJSON(dataString: string): string {
        const parts = dataString.split('/');
        const day = parseInt(parts[0], 10);
        const month = parseInt(parts[1], 10);
        const year = parseInt(parts[2], 10);
        return `${year}-${month.toString().padStart(2, '0')}-${day.toString().padStart(2, '0')}`;
    }
5 respostas

Provavelmente serializador ou o desserializador normal usado no Spring Boot para converter o codigo em Java para JSON, não tem suporte nativo para a classe 'LocalDate'.

Tenta adicionar esta dependência ('jackson-datatype-jsr310') no seu projeto para habilitar o suporte para o 'java.time.LocalDate', se tu tiver usando Maven.

com.fasterxml.jackson.datatype jackson-datatype-jsr310

Mas eu ja adicionei a dependencia como mencionado acima:

<dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>2.13.0</version> <!-- Versão mais recente no momento do seu projeto -->
        </dependency>

Tentei alterar o campo para Date, porém a informação é salva como 'null' no banco de dados. No debug esta assim:

Insira aqui a descrição dessa imagem para ajudar na acessibilidadeNotei que dados.dataNascimento.cdate null Porém quando avanço ele assume o valor do json que recebo em dados: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Mas mesmo assim salva no banco de dados como null: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Porque isso acontece?

solução!

Tu usou o padrão "date" do banco de dados? yyyy-mm-dd ?

Eu ainda acho q o problema e no 'jackson-datatype-jsr310' pra garantir q ele fique devidamente registrado no ObjectMapper do Jackson.

Tenta adicionar explicitamente o registro do módulo 'JavaTimeModule' pra garantir que 'LocalDate' seja tratado da forma correta.

@Configuration public class JacksonConfig { @Bean public ObjectMapper objectMapper() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.registerModule(new JavaTimeModule()); return objectMapper; } }

E veja se a versão do jackson que vc esta usando e o compativel com o módulo definido 'jackson-datatype-jsr310' especificando no 'pom.xml' . As vezes acontece de a incompatibilidade de versões dar esse tipo de problema.

E depois de fazer as alterações sempre reinicia seu servidor so pra garantir que as mudanças foram aplicadas.

Obrigada pela ajuda. Adicionei a classe de configuração e também as seguintes anotações:

@JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonSerialize(using = LocalDateSerializer.class)
        LocalDate dataNascimento,

Com isso resolvido o problema.