[英]List of ZonedDateTime as request body with Spring
我正在使用带@PostMapping
注释的方法实现Spring @RestController
。 我想允许使用此正文的HTTP POST:
{"dateTimes":[
"2017-07-19T14:25+02:00",
"2017-08-19T14:25+02:00"
]
}
我有一个用作@RequestBody
的对象:
public class TransactionAllowedRequestBody {
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private List<ZonedDateTime> dateTimes;
public List<ZonedDateTime> getDateTimes() {
return dateTimes;
}
public void setDateTimes(List<ZonedDateTime> dateTimes) {
this.dateTimes = dateTimes;
}
}
这是我的控制器方法:
@PostMapping("/transaction-allowed")
public void isTransactionAllowed(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestBody TransactionAllowedRequestBody requestBody) {
System.out.println("requestBody = " + requestBody);
}
但是,当我尝试这样做时,我得到:
Could not read JSON document: Can not construct instance of java.time.ZonedDateTime:
no String-argument constructor/factory method to deserialize from String value ('2017-07-19T14:25+02:00')
如果我将ZonedDateTime
替换为String
,那么它将起作用。
我正在使用Spring Boot 1.5.3。
注意:在GET请求参数上使用@DateTimeFormat
可以正常工作。 我尝试了:
@GetMapping("/transaction-allowed")
public void isTransactionAllowed(@AuthenticationPrincipal CustomUserDetails userDetails,
@RequestParam("datetime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) ZonedDateTime dateTime) {
System.out.println("userDetails = " + userDetails);
System.out.println("dateTime = " + dateTime);
}
似乎问题是我忘了包含jackson-datatype-jsr310
依赖项,因为Spring Boot默认不会添加它:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
</dependency>
您可以使用@JsonDeserialize
和自己的反序列化器
像下面的一个
public class ZonedDateTimeDeserializer extends JsonDeserializer<List<ZonedDateTime>> {
@Override
public List<ZonedDateTime> deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode array = oc.readTree(jp);
List<ZonedDateTime> dates = new ArrayList<>();
if(array.isArray()) {
for (JsonNode node: array) {
dates.add(ZonedDateTime.parse(node.asText()));
}
}
return dates;
}
}
使用Deserializer注释将像
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private List<ZonedDateTime> dateTimes;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.