我有一个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 {
// ...
}
这将导致映射失败。