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 调用
Google Fit REST API - 带有空格的 dataStreamId 导致错误