当前位置: 首页 > 知识库问答 >
问题:

(德)与杰克逊一起序列化日期时间(Joda)

郁宾鸿
2023-03-14

我正在构建一个REST网络服务。某些类的属性类型为DateTime(JodaTime)。

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

private DateTime date;

被转化为

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

问题是我把这个对象发回服务器时出错了,因为我无法实例化Chronology

我想有像{date:1487289600000}-任何其他格式都可以。

环境

  • 杰克逊-注释2.8.8
  • jackson-core 2.8.8
  • 杰克逊-数据库2.8.8
  • jackson-datatype-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,我会得到相同的结果

我添加了< code > Jackson-jaxrs-JSON-provider 2 . 8 . 8 、< code > Jackson-jaxrs-base 2 . 8 . 8 和< code > Jackson-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);
        }
    }

}

对象

public class Value {

    private DateTime date;
    private Float value;

    public Value() {
    }

    //getter and setter

}

我在< code>ApplicationConfig中添加了以下代码

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

我的日期时间现在已转换为

"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服务器。容器异常:java.lang.NoClassDefFoundError:com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector

共有1个答案

魏安宁
2023-03-14

您可能在应用程序中缺少杰克逊-贾克斯-json-提供程序模块。

该模块是JAX-RS实现(如Jersey和RESTeasy)的Jackson JSON提供者。

仅当需要为 Jackson JSON 提供程序自定义对象映射程序时,才需要对象映射器上下文解析器。但是,如果杰克逊提供程序未注册,则上下文解决程序不会执行任何操作。

这是您需要的依赖项:

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

如果没有使用Maven,请将< code > Jackson-jaxrs-JSON-provider-2 . 8 . 8 . jar 添加到类路径中。

然后根据需要注册杰克逊约翰逊提供器(仅使用杰克逊注释)或杰克逊JaxbJson提供程序(同时使用杰克逊和JAXB注释)。

 类似资料:
  • 我对jackson进行了配置,以便在和时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。 但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常: 很抱歉没有提到我在单元测试中。 TestClass:

  • 问题内容: 我需要设置班级日期序列化的格式。我有Jackson的版本,没有@JsonFormat。这就是为什么我编写自定义类的原因: } 并使用它: 但是,我还有另一个具有不同日期格式的字段,并且我不想创建用于序列化的其他类。我可以将所有需要的格式(例如常量)添加到CDJsonDateSerializer类中,并通过注释设置所需的格式吗?像这样: 。 下面的答案后: 经过一些更正后,它可以工作。我

  • (我在UTC 2时区,我假设是2小时的差异)。 我正忙于编写一个JSON RESTful API,它是Grails应用程序的一部分(特别是本项目的2.0.3,但这个问题在其他版本中也会出现)。我使用Jackson对Json进行序列化和反序列化,JsonService的配置如下所示:http://pastebin.com/JacytMuF 因此,多个域对象的值在单个DTO中进行了整理和表示(在本例中

  • 问题内容: 我想将日期从Twitter反序列化为。我的程序在反序列化领域失败。 我的网域课程 我的解析方法 两项测试均失败,并出现java.time.ZonedDateTime 错误。 我已经检查了关于Stackoverflow的类似问题,我的格式看起来正确。 我做错了吗? 解决了 问题出在地区。添加确切的区域设置后,测试开始通过。 对于 用于测试 问题答案: 尝试在您的媒体资源上添加此注释

  • 我想将Twitter上的日期反序列化为。我的程序在<code>created_at</code>字段反序列化时失败。 我的域名类 我的解析方法 两个测试都失败,java.time.ZonedDateTime 类型的值。 我在Stackoverflow上检查了类似的问题,我的格式看起来是正确的。 我做错了? 解决 问题出在区域设置中。添加确切的区域设置后,测试开始通过。 对于<code>jackso

  • 有没有办法让Jackson序列化某个流对象(并在之后关闭)?这样地: 使现代化 澄清:我想流式传输内容,而不仅仅是将其序列化到单个String对象。