3

我尝试使用 Resteasy CLIENT 调用一项 REST 服务

在我的服务中,我使用 springboot 创建并返回一个 LocalDateTime 属性

如果我使用这种依赖

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.8.8</version>
</dependency>

这是我的 bean 中的代码:

private LocalDateTime dtPublicacao;

这是我调用我的服务时的结果:

dtPublicacao:“2017-04-20T00:00:00”

如果我删除这个结果:

dtPublicacao: {
  hour: 0,
  minute: 0,
  second: 0,
  nano: 0,
  dayOfYear: 110,
  dayOfWeek: "THURSDAY",
  month: "APRIL",
  dayOfMonth: 20,
  year: 2017,
  monthValue: 4,
  chronology: {
    id: "ISO",
    calendarType: "iso8601"
  }
}

所以在我的客户中,我创建了相同的模型并使用它来执行 Get

Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://localhost:8585").path("/edital/");
        try{
            List<EditalVO> response = target.request().get(new GenericType<List<EditalVO>>(){});
            return response;
        }catch (NotFoundException e) {          
            throw new NotFoundException();
        }       

因此,如果我将 LocalDateTime 放入客户端,则会收到此错误:

引起:org.codehaus.jackson.map.JsonMappingException:无法从JSON字符串实例化类型[简单类型,类java.time.LocalDateTime]的值;没有单字符串构造函数/工厂方法(通过参考链:br.com.lumera.protesto.edital.vo.EditalVO["dtExpiracao"])

解决我需要在我的客户表单中更改 LocalDateTime 到 Date 并添加

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dtPublicacao;

我已经尝试在我的客户端中添加相同的依赖项,但是他注册了 LocalDateTimeSerializer.class 但是当我调用 REST 时,他没有通过 serialize 方法,我又得到了错误。

我可以从我的 Restasey 客户端接收和发送 LocalDateTime 吗?

tks

更新 我也已经尝试过这样做:

ObjectMapper obj = new ObjectMapper();
obj.registerModule(new JavaTimeModule())

没有成功,然后我尝试在我的客户中:

client.register(obj);

没有成功..如果我调试我的应用程序,他会输入方法

public LocalDateTimeSerializer(DateTimeFormatter f) {
    super(LocalDateTime.class, f);
}

private LocalDateTimeSerializer(LocalDateTimeSerializer base, Boolean useTimestamp, DateTimeFormatter f) {
    super(base, useTimestamp, f);
}

在 LocalDateTimeSerializer 但不要进入序列化方法或反序列化

4

2 回答 2

1

不完全确定,但似乎你需要有这种依赖

并通过注册模块

objectMapper.registerModule(new JavaTimeModule());
于 2017-04-26T08:23:47.850 回答
0

如何配置ObjectMapper到 resteasy-client 模块?你可以看到这个问题


我已经写了两个测试如何在github上适应另一侧。

适合客户端到服务器端

如果您希望客户端适合服务器端,则必须将模式 DateFormat 设置为"yyyy-MM-dd'T'HH:mm:ss",例如:

ObjectMapper#setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"))

或者您可以@JsonFormat用作:

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private Date dtPublicacao;

适合服务器端到客户端

如果您希望服务器端适合客户端,则必须将模式 DateTimeFormatter 设置为"yyyy-MM-dd HH:mm:ss",例如:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
Module module = new JavaTimeModule().addDeserializer(LocalDateTime.class
                                      ,new LocalDateTimeDeserializer(formatter));

ObjectMapper#registerModule(module);
于 2017-04-26T13:09:54.240 回答