Rest API 调用返回带有 LocalDate 的错误

Posted

技术标签:

【中文标题】Rest API 调用返回带有 LocalDate 的错误【英文标题】:Rest API call returns error with LocalDate 【发布时间】:2019-10-21 22:31:33 【问题描述】:

我正在尝试进行休息 api 调用,但不断收到 400 Bad Request。从日志来看,我的 POJO 的 LocalDate 字段之一似乎存在问题。

我的 POJO:

public class MyObj implements Serializable 
private Long id;
private String remark;
private LocalDate someDate;
...other fields, getter and setter

在我的main()

MyObj myObj = new MyObj();
myObj .setRemark("My test case");
myObj .setSomeDate( LocalDate.now());
...

 WebResource webResource = client
                .resource("my_url");

        webResource
                .header("apikey", "mykey")
                .accept("application/json")
                .type("application/json")
                .post(MyObj.class, myObj );

运行上面的代码我得到以下错误: Bad Request: JSON parse error: Expected array or string.; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Expected array or string. at [Source: (PushbackInputStream); line: 1, column: 159] (through reference chain: com.xxx.MyObj["someDate"])

知道为什么会发生上述情况吗?

【问题讨论】:

正如错误所说的预期数组或字符串,您传递的是 POJO 中的 LocaleDate 对象,使其成为字符串,并且在代码级别可能具有相同的 LocaleDate 对象并使用 toString( )。 您能否将my_url 生成的JSON 结构添加到您的问题中?如果我没记错的话,Jackson 期望格式为 [2019, 6, 6]"2019-06-06",并且我假设您的 REST 服务没有这样做。 【参考方案1】:

LocalDate 应在序列化时转换为字符串,并在反序列化时转换回 LocalDate。为此,您可以在对象 LocalDate 属性上使用 @JsonDeserialize@JsonSerialize

@JsonDeserialize(using = LocalDateDeserializer.class)
@JsonSerialize(using = LocalDateSerializer.class)
private LocalDate someDate;

有关更多信息,请参阅此链接: https://kodejava.org/how-to-format-localdate-object-using-jackson

另一种方法是使用ObjectMapper并注册模块JavaTimeModule()

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

使用 ObjectMapper 和类似问题的示例: https://groups.google.com/forum/#!topic/jackson-user/XdHvRKG1vhY

【讨论】:

【参考方案2】:

您需要对 LocalDate 进行注释以说明应如何将其转换为字符串。这是 ZonedDateTime 的 sn-p,但您需要做的就是更改掩码以适合 LocalDate。

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSZ")
public ZonedDateTime getTime() 
    return time;

这里是原始问题的链接:Spring Data JPA - ZonedDateTime format for json serialization

【讨论】:

以上是关于Rest API 调用返回带有 LocalDate 的错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 SpringBoot 配置文件模拟 REST API 调用

javascript 带有REST API调用的Html表

Google Fit REST API - 带有空格的 dataStreamId 导致错误

REST API 是不是应该始终返回带有消息的响应?

根据来自带有 JQuery 的 REST API 的 JSON 响应更改 HTML 结构

在带有 HTTP 状态代码 405 的 REST API 中返回啥错误消息?