当我尝试在我的 Spring Boot 应用程序中使用 Jackson返回带有LocalDateTime字段的自定义ErrorResponse对象时遇到以下错误:
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"])
问题:
尽管添加了必要的 Jackson 配置,但我仍然收到错误,表明默认情况下不支持LocalDateTime 。
当我用Map<String, Object>替换ErrorResponse时,它可以工作,但这不是我想要处理错误响应的方式。
我尝试过的:
添加了jackson-datatype-jsr310依赖项。
在ObjectMapper中注册了JavaTimeModule。
在ErrorResponse中的LocalDateTime字段上配置了@JsonFormat。
问题:
如何在我的自定义ErrorResponse类中使用 Jackson正确序列化LocalDateTime并修复上述错误?
AuthenticationEntryPointJwt.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()
);
错误响应.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;
}
}
我尝试添加 JacksonConfig,但问题仍然存在。
@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>