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

杰克逊本地日期/时间反序列化

陶裕
2023-03-14

我对jackson进行了配置,以便在java.time.localdatejava.time.localdateTime时给出一个简单的字符串表示。这可以在序列化过程中找到,例如,当我在REST API上获得数据时。

但反过来就不行了。当我试图将数据发送到服务器,并且应该将JSON解析为java对象时,会引发此异常:

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {
    @Override
    public ObjectMapper getContext(Class<?> aClass) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new JavaTimeModule());
        mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);

        return mapper;
    }
}
JavaTimeModule dateTimeModule = new JavaTimeModule();
dateTimeModule.addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE);
dateTimeModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);

mapper.registerModule(dateTimeModule);

很抱歉没有提到我在单元测试中。

TestClass:

import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import javax.ws.rs.core.Application;

import java.time.LocalDate;
import java.time.LocalDateTime;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;


public class PocRestTest extends JerseyTest {

    private static PocService mockedPocService;

    @Override
    protected Application configure() {
        mockedPocService = Mockito.mock(PocService.class);
        ResourceConfig config = new ResourceConfig();
        config.register(new PocRest(mockedPocService));
        config.register(ObjectMapperContextResolver.class);
        return config;
    }

    private Poc dto;

    @Before
    public void init() {
        dto = new Poc();
        dto.setId(1);
        dto.setName("hi rest");
        dto.setDate(LocalDate.now());
        dto.setDateTime(LocalDateTime.now());

        doReturn(dto).when(mockedPocService).getPocById(1);
    }

    @Test
    public void test() {
        Poc response = target("poc/1").request().get(Poc.class);
        assertEquals(dto.getId(), response.getId());
        assertEquals(dto.getName(), response.getName());
        assertEquals(dto.getDate(), response.getDate());
        assertEquals(dto.getDateTime(), response.getDateTime());

        verify(mockedPocService).getPocById(1);
        verifyNoMoreInteractions(mockedPocService);
    }
}

共有1个答案

龙枫
2023-03-14

您通过JerseyTestconfigure()方法向服务器注册了ContextResolver,但是如果查看异常,您将看到这是一个客户端异常(注意包名称中的client)。所以问题出在客户端。您所缺少的是,从JSON到POC的反序列化也需要在客户端进行,因此还需要在客户端注册ContextResolver。为此,可以在JerseyTest上重写ConfigureClient(),并在那里注册ContextResolver

@Override
public void configureClient(ClientConfig config) {
    config.register(ObjectMapperContextResolver.class);
}
 类似资料:
  • 我正在构建一个REST网络服务。某些类的属性类型为(JodaTime)。 将此对象发送给我的客户端(Javascript)时,我的对象 被转化为 问题是我把这个对象发回服务器时出错了,因为我无法实例化 我想有像-任何其他格式都可以。 环境 杰克逊-注释2.8.8 jackson-core 2.8.8 杰克逊-数据库2.8.8 jackson-datatype-joda 2.8.8 joda-tim

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

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

  • Java Jackson能否将一个json字符串date反序列化成Java Long字段(从epoch开始的毫秒数)? 这是一个要反序列化的json字段的示例: 这是Java类中的同一字段,带有当前注释: 但是,发生异常: com . faster XML . Jackson . databind . exc . invalidformatexception:无法从字符串“2022-01-02T0

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

  • 问题内容: 我有一个REST WS来更新一个接收JSON字符串作为输入的bean对象。 ABean是一种复杂类型,还包含其他对象, 例如: svc.save(…) 将保存bean和嵌入的对象 。 出于安全原因,我想过滤掉一些可以由JSON字符串更新的属性,但是我想动态地做到这一点,以便对于每个WS(或用户角色),我都可以决定阻止哪些属性被更新(所以我不能简单地使用杰克逊景观) 总而言之,有什么方法