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')}`;
}