gpt4 book ai didi

java - 与 Jackson 一起(去)序列化 DateTime (Joda)

转载 作者:行者123 更新时间:2023-11-30 06:39:22 25 4
gpt4 key购买 nike

我正在构建一个 REST Web 服务。某些类具有 DateTime (JodaTime) 类型的属性。

当将此对象发送到我的客户端(Javascript)时,我的对象

private DateTime date;

转换为

{ date: { chronology: {}, millis: 1487289600000 } }

问题是我将此对象发送回服务器时出错,因为我无法实例化chronology

我想要类似 { date: 1487289600000} - 任何其他格式都可以。

环境

  • jackson 注释 2.8.8
  • jackson 核心 2.8.8
  • jackson -databin 2.8.8
  • jackson 数据类型-joda 2.8.8
  • Joda Time 2.7

我的上下文解析器是

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

final ObjectMapper mapper = new ObjectMapper();

public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}

我错过了什么?如果我没有使用ObjectMapperContextResolver,我会得到相同的结果

更新@Cássio Mazzochi Molin 的回答

我添加了 jackson-jaxrs-json-provider 2.8.8jackson-jaxrs-base 2.8.8jackson-module-jaxb-annotations 2.8 .8

我的上下文解析器现在是这样的

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

final ObjectMapper mapper = new ObjectMapper();

public ObjectMapperContextResolver() {
mapper.registerModule(new JodaModule());
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}
}

以及我的应用程序配置

@javax.ws.rs.ApplicationPath("/")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
resources.add(AuthenticationFilter.class);
resources.add(CORSFilter.class);
resources.add(ObjectMapperContextResolver.class);
resources.add(JacksonJsonProvider.class);
resources.add(ServiceResource.class);
return resources;
}
}

我的服务资源

@Path("service")
public class ServiceResource {

@Path("/forecast/stocks/{modelId}")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Value> getStocks(@PathParam("modelId") String modelId, @QueryParam("startDate") String startDate, @QueryParam("endDate") String endDate) {
try {
DateTime datetimeStart = formatStringToDatetime(startDate);
DateTime datetimeEnd = formatStringToDatetime(endDate);
return logicClass.getStocks(modelId, datetimeStart, datetimeEnd);
} catch (Exception e) {
logger.log(Level.SEVERE, "Error calling /hydromax/forecast/stocks", e);
throw new WebApplicationException(Response.Status.INTERNAL_SERVER_ERROR);
}
}

}

以及Value对象

public class Value {

private DateTime date;
private Float value;

public Value() {
}

//getter and setter

}

更新

我在ApplicationConfig中添加了以下代码

@Override
public Map<String, Object> getProperties() {
Map<String, Object> props = new HashMap<>();
props.put("jersey.config.server.disableMoxyJson", true);
return props;
}

我的DateTime现已转换为

"date":{"dayOfMonth":16,"dayOfWeek":4,"era":1,"year":2017,"dayOfYear":47,"weekOfWeekyear":7,"secondOfMinute":0,"millisOfSecond":0,"weekyear":2017,"monthOfYear":2,"hourOfDay":10,"minuteOfHour":0,"yearOfEra":2017,"yearOfCentury":17,"centuryOfEra":20,"millisOfDay":36000000,"secondOfDay":36000,"minuteOfDay":600,"millis":1487235600000,"zone":{"fixed":false,"uncachedZone":{"fixed":false,"cachable":true,"id":"Europe/Paris"},"id":"Europe/Paris"},"chronology":{"zone":{"fixed":false,"uncachedZone":{"fixed":false,"cachable":true,"id":"Europe/Paris"},"id":"Europe/Paris"}},"afterNow":false,"beforeNow":true,"equalNow":false} 

部署后第一次调用该服务时,出现此错误

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector

最佳答案

您可能错过了 jackson-jaxrs-json-provider您的应用程序中的模块。

此模块是 JAX-RS 实现的 Jackson JSON 提供程序,例如 Jersey 和 RESTeasy。

一个ContextResolver对于 ObjectMapper仅当您需要自定义 ObjectMapper 时才需要对于 Jackson JSON 提供者。但是ContextResolver如果 Jackson 提供商未注册,则不会执行任何操作。

<小时/>

这是您需要的依赖项:

<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.8.8</version>
</dependency>

如果您不使用 Maven,请添加 jackson-jaxrs-json-provider-2.8.8.jar到类路径。

然后注册JacksonJsonProvider (仅使用 Jackson 注释)或 JacksonJaxbJsonProvider (使用 Jackson 和 JAXB 注释),根据您的需要。

关于java - 与 Jackson 一起(去)序列化 DateTime (Joda),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44652189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com