Estou encontrando o seguinte erro ao tentar retornar um objeto ErrorResponse personalizado com um campo LocalDateTime usando Jackson no meu aplicativo Spring Boot:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Java 8 date/time type `java.time.LocalDateTime` not supported by default: add Module "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" to enable handling (through reference chain: com.taskflow.taskflow.exceptions.ErrorResponse["timestamp"])
Problema:
Apesar de adicionar a configuração necessária do Jackson, ainda recebo o erro indicando que LocalDateTime não é suportado por padrão.
Quando substituo ErrorResponse por um Map<String, Object> , funciona, mas não é assim que quero lidar com respostas de erro.
O que eu tentei:
Adicionada dependência jackson-datatype-jsr310 .
Registrou o JavaTimeModule no ObjectMapper .
Configurado @JsonFormat no campo LocalDateTime em ErrorResponse .
Pergunta:
Como posso serializar corretamente LocalDateTime com Jackson na minha classe ErrorResponse personalizada e corrigir o erro acima?
AutenticaçãoEntryPointJwt.java:
@Component
public class AuthenticationEntryPointJwt implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
ErrorResponse errorResponse = new ErrorResponse(
HttpServletResponse.SC_FORBIDDEN,
"Forbidden",
"You do not have permission to access this resource.",
request.getRequestURI()
);
ErrorResponse.java:
@Getter
@Setter
public class ErrorResponse {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "UTC")
private LocalDateTime timestamp;
private int status;
private String error;
private String message;
private String path;
public ErrorResponse(int status, String error, String message, String path) {
this.timestamp = LocalDateTime.now();
this.status = status;
this.error = error;
this.message = message;
this.path = path;
}
}
Tentei adicionar JacksonConfig, mas continua o mesmo problema.
@Configuration
public class JacksonConfig {
@Bean
@Primary
public ObjectMapper objectMapper(){
return new ObjectMapper()
.registerModule(new JavaTimeModule()) // Enables LocalDateTime serialization
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // Ensures proper formatting
}
}
pom.xml
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.18.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.2</version>
</dependency>