You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestEasy客户端POST请求Java 8 LocalDateTime序列化失败问题排查

RestEasy客户端Java 8 LocalDateTime序列化失败问题

接口定义

使用RestEasy客户端调用如下POST接口,其中points参数是Java 8 LocalDateTime类型的列表:

@POST
@Path("/somePath")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
Response getPoints(@QueryParam("assetId") String assetId, List<LocalDateTime> points);

已做配置

  1. 引入jackson-datatype-jsr310依赖
  2. 实现ContextResolver<ObjectMapper>自定义Jackson配置类,注册JavaTimeModule:
public class JacksonConfig implements ContextResolver<ObjectMapper> {
    private static final ObjectMapper objectMapper = new ObjectMapper();
    // 省略其他初始化逻辑
    objectMapper.registerModule(new JavaTimeModule());
}
  1. 将JacksonConfig添加到web.xml的resteasy.providers配置项中

问题现象

调用getPoints接口时,抛出「Java 8 date/time type not supported by default」错误,但服务端直接返回LocalDateTime对象时序列化正常:

LocalDateTime ldt = LocalDateTime.now();
return Response.status(Response.Status.OK).entity(ldt).build();

错误堆栈信息:

Caused by: 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: java.util.LinkedList[0])
    at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:77) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.SerializerProvider.reportBadDefinition(SerializerProvider.java:1306) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.impl.UnsupportedTypeSerializer.serialize(UnsupportedTypeSerializer.java:35) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContentsUsing(CollectionSerializer.java:171) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serializeContents(CollectionSerializer.java:116) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:107) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.std.CollectionSerializer.serialize(CollectionSerializer.java:25) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider._serialize(DefaultSerializerProvider.java:480) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ser.DefaultSerializerProvider.serializeValue(DefaultSerializerProvider.java:400) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ObjectWriter$Prefetch.serialize(ObjectWriter.java:1568) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at com.fasterxml.jackson.databind.ObjectWriter.writeValue(ObjectWriter.java:1061) ~[jackson-databind-2.14.0-rc2.jar:2.14.0-rc2]
    at org.jboss.resteasy.plugins.providers.jackson.ResteasyJackson2Provider.writeTo(ResteasyJackson2Provider.java:345) ~[resteasy-jackson2-provider-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.writeTo(AbstractWriterInterceptorContext.java:284) ~[resteasy-core-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.syncProceed(AbstractWriterInterceptorContext.java:245) ~[resteasy-core-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.core.interception.jaxrs.AbstractWriterInterceptorContext.proceed(AbstractWriterInterceptorContext.java:224) ~[resteasy-core-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.writeRequestBody(ClientInvocation.java:446) ~[resteasy-client-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.writeRequestBodyToOutputStream(ManualClosingApacheHttpClient43Engine.java:625) ~[resteasy-client-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.buildEntity(ManualClosingApacheHttpClient43Engine.java:584) ~[resteasy-client-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.loadHttpMethod(ManualClosingApacheHttpClient43Engine.java:489) ~[resteasy-client-4.7.7.Final.jar:4.7.7.Final]
    at org.jboss.resteasy.client.jaxrs.engines.ManualClosingApacheHttpClient43Engine.invoke(ManualClosingApacheHttpClient43Engine.java:299) ~[resteasy-client-4.7.7.Final.jar:4.7.7.Final]
    ... 61 more

疑问

  • RestEasy是否应该使用自定义的JacksonConfig来序列化POST请求体?为何配置未生效?
  • 服务端返回LocalDateTime正常、客户端发送LocalDateTime列表失败,这两个序列化场景有何差异?
  • 两个场景是否应该共用同一个ObjectMapper?
  • 如何让客户端使用配置好的ObjectMapper完成序列化?

内容的提问来源于stack exchange,提问作者idan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:18:10