【问题标题】:Client Resteasy with LocalDateTime使用 LocalDateTime 的客户端 Resteasy
【发布时间】:2017-09-23 02:21:58
【问题描述】:

我尝试使用 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:不能 实例化类型的值 [简单类型,类 java.time.LocalDateTime] 来自 JSON 字符串;没有单字符串构造函数/工厂方法(通过 参考链: 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 中但不要进入序列化方法或反序列化

【问题讨论】:

  • javadoc 说:注册一个扩展提供者或者一个特性元提供者实例可以在这个上下文的范围内使用。

标签: java-8 resteasy jackson-modules


【解决方案1】:

如何将ObjectMapper 配置到resteasy-client 模块中?你可以看到这个question。


我已经写了两个测试如何在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);

【讨论】:

    【解决方案2】:

    不完全确定,但您似乎需要这个dependency

    并通过

    注册模块
    objectMapper.registerModule(new JavaTimeModule());
    

    【讨论】:

    • 是的,你是对的。测试已断言您必须在deserialization 之前注册JavaTimeModule。
    • @holi-java 你花时间看实际测试,不错!
    • 我相信一线程序员当我不确定如何使用该库时,如果意图明确的话,只需几分钟就不会花费太多时间。
    • 嗨,尤金。并且OP的@JsonFormat的模式在客户端应该是"yyyy-MM-dd'T'HH:mm:ss"。
    • @Eugene 我已经尝试这样做了。我会用我的测试更新我的问题
    猜你喜欢
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多