默认情况下不支持 Java 8 日期/时间类型 - 使用 RestEasy 客户端 POST 请求时

问题描述 投票:0回答:1

我正在使用 RestEasy 客户端 POST 请求,如下界面所示:

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

其中“points”是 Java 8 LocalDateTime 的列表。

我使用“jackson-datatype-jsr310”作为依赖项。

我添加了一个提供者自定义 Jackson 配置,该配置实现 ContextResolver 并保存 objectMapper 并注册了 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 日期/时间类型”错误。

restEasy 是否应该使用 JacksonConfig 作为序列化 POST 对象的提供者?因为看起来好像没有。

注意,当在另一个地方,使用restEasy将'LocalDateTime'作为对象返回时,添加“jackson-datatype-jsr310”和

JavaTimeModule
注册后序列化工作正常(在此之前,这是相同的错误):

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

2个序列化有什么区别?两者都应该使用相同的 objectMapper 吗?

谢谢,

错误的堆栈跟踪:

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

期望序列化通过使用配置的 objectMapper 来工作

java resteasy java-time objectmapper jackson-modules
1个回答
0
投票

首先,如果您要返回类的某个实例,其中其中一个属性是

LocalDateTime
类型的变量,则需要使用类似于以下的注释来注释该属性:

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS")

但是,如果您只是将

LocalDateTime
作为独立值返回,则可以在代码中对其进行格式化并将其作为字符串返回。无论如何,第一个选项的好答案可以在这里看到:Spring Data JPA - ZonedDateTime format for json serialization

© www.soinside.com 2019 - 2024. All rights reserved.