如何为Java 8 Instant类启用POJO映射?

我有一个StartupListener注册了JavaTime模块。但是我仍然遇到错误

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.Instant` (no Creators,like default construct,exist): cannot deserialize from Object value (no delegate- or property-based Creator)
@WebListener
public class StartupListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.log(Level.CONFIG,"servlet content initialized");
        ObjectMapper objectMapper = new ObjectMapper();
        //objectMapper.findAndRegisterModules();
        JavaTimeModule module = new JavaTimeModule();
        objectMapper.registerModule(module);
    }
}

我在启用POJOMapping的情况下使用Jersy。我的模型类有Instant dateCreated;失败。我的依赖项是:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.19</version>
</dependency>
...
<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.10.0</version>
</dependency>

该如何解决?


@JsonIgnoreProperties(ignoreUnknown = true)
public class ProductDTO {
    private String name;
    private String description;

    private String mrp;
    private String price;
    private String savePrice;

    private String url;
    private String imageURL;
    private String ratings;
    private String ratingsCount;

    private Instant dateCreated;

    public Instant getDateCreated() {
        return dateCreated;
    }

    public void setDateCreated(Instant dateCreated) {
        this.dateCreated = dateCreated;
    }

   // ..


我已经添加了lombok依赖项,并按照答案中的说明进行了注释,但是我仍然遇到相同的错误。请找到错误日志:

[INFO] GCLOUD: Nov 14,2019 12:29:42 PM com.sun.jersey.spi.container.ContainerResponse mapMappableContainerException
[INFO] GCLOUD: SEVERE: The exception contained within MappableContainerException could not be mapped to a response,re-throwing to the HTTP container
[INFO] GCLOUD: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.Instant` (no Creators,exist): cannot deserialize from Object value (no delegate- or property-based Creator)
[INFO] GCLOUD:  at [Source: (org.eclipse.jetty.server.HttpInputOverHTTP); line: 1,column: 1245] (through reference chain: com.proto.model.ProductDTO["dateModified"])
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1589)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1055)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1297)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1682)
[INFO] GCLOUD:  at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:977)
[INFO] GCLOUD:  at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:814)
[INFO] GCLOUD:  at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:490)
[INFO] GCLOUD:  at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getvalue(EntityParamDispatchProvider.java:123)

我正在用自定义值填充ProductDTO,并将其作为POST发送到作为应用程序引擎任务工作者的其余端点。

ProductDTO {
name = "8X (Black,4GB RAM,64GB Storage)"
description = ""
mrp = "7,999.00"
price = ""
url = ""
imageURL = ""
ratings = "4.4"
ratingsCount = "5,910"
dateCreated = {Date@7067} "Thu Nov 14 12:41:14 IST 2019"
dateModified = {Instant@9346} "2019-11-14T07:12:47.255Z"
}

接受此dto的端点是

@POST
@Path("/transform")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public WorkerResponse transform(ProductDTO dto) throws IOException {
    // ...
}

这将导致映射失败。

baitu1987 回答:如何为Java 8 Instant类启用POJO映射?

首先,确保您的Json节点具有正确的名称-dateCreated。 然后,确保您具有默认的@NoArgsConstructor/@AllArgsConstructor合作者。 尝试使用以下命令修改您的ObjectMapper

ObjectMapper mapper = new ObjectMapper().findAndRegisterModules().disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

默认情况下,杰克逊将Instant取消实现为时间戳,因此您需要将其禁用。

lombok批注的用法:

  @AllArgsConstructor
     @NoArgsConstructor
     @Data
     @JsonIgnoreProperties(ignoreUnknown = true)
public class ProductDTO {
...
}
本文链接:https://www.f2er.com/3110858.html

大家都在问