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);
已做配置
- 引入
jackson-datatype-jsr310依赖 - 实现
ContextResolver<ObjectMapper>自定义Jackson配置类,注册JavaTimeModule:
public class JacksonConfig implements ContextResolver<ObjectMapper> { private static final ObjectMapper objectMapper = new ObjectMapper(); // 省略其他初始化逻辑 objectMapper.registerModule(new JavaTimeModule()); }
- 将
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
相关产品推荐
相关产品推荐

