Spring -如何将请求模型中传入控制器的JSON主体字段中的日期字符串表示转换为OffsetDateTime.<



我有遗留数据进入我的API作为UserRequest模型的一部分,如

@PostMapping
public MyResponse saveUser(@Valid @RequestBody UserRequest userRequest) {
...
}

UserRequest类使用OffsetDateTime为dateRegistered字段:

public class UserRequest {
...
OffsetDateTime birthDate;
...
}

我遇到的问题是,数据进入API使用以下格式的dateRegistered字段:

{
"last-name":"Mikel",
"birth-date":"20200716"
}

那么,字符串表示"20200716"从JSON请求需要以某种方式转换为OffsetDateTime,如"2020-07-16T00:00:00Z"(时间部分和偏移量设置为0)。

默认">20200716":

{
"last-name":"Mikel",
"birth-date":"20200716"
}

,转换为

OffsetDateTime
{
"last-name": "Mikel",
"birth-date": "1970-08-22T19:18:36Z"
}

,这显然是错误的。

如何在Json字段中转换日期的字符串表示,如">20200716";到OffsetDateTime表示,如">2020-07-16T00:00:00Z";或">2020 - 07 - 16 - t00:00:00.000 + 0"?

我试图用@JsonFormat("yyyyMMdd")注释我的OffsetDateTime字段,但这是抛出异常,如:JSON解析错误:无法从字符串"20200716"反序列化java.time.OffsetDateTime类型的值.

你不需要JSON注释。您需要按如下方式调整setter。

public class MedicalCandidateRequest {

private OffsetDateTime dateRegistered;

public OffsetDateTime getDateRegistered() {
return dateRegistered;
}

public void setDateRegistered(String dateString) {
final String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSxx";
DateTimeFormatter dtFormatter = DateTimeFormatter.ofPattern(pattern);
this.dateRegistered = OffsetDateTime.parse(dateString, dtFormatter );
}
}

将setter方法的参数改为String,并自行进行转换。

public void setDateRegistered(String value) {
this.dateRegistered = doConversionHere(value);
}

谢谢你的建议,但我已经决定用我自己的实现。

我提供了一个自定义的反序列化器,如:
public class CustomDateDeserializer extends JsonDeserializer<OffsetDateTime> {
private static final String PATTERN = "yyyyMMdd";
private final DateTimeFormatter formatter;
public CustomDateDeserializer() {
this.formatter = DateTimeFormatter.ofPattern(PATTERN);
}
@Override
public OffsetDateTime deserialize(JsonParser parser, DeserializationContext context) throws IOException, JacksonException {
LocalDate localDate = LocalDate.parse(parser.getText), formatter);
OffsetDateTime offsetDateTime = OffsetDateTime.of(localDate, LocalTime.MIDNIGHT, ZoneOffset.UTC);
return offsetDateTime;
}
}

,然后我用它来注释我的模型字段,如:

@JsonDeserialize(using = CustomDateDeserializer.class)
private OffsetDateTime birthDate;

最新更新