Java 带Spring的ZoneDateTime作为请求主体的列表
我正在用@PostMapping注释方法实现一个Spring@RestController。我想允许使用此正文的HTTP POST:Java 带Spring的ZoneDateTime作为请求主体的列表,java,spring,spring-boot,jackson,Java,Spring,Spring Boot,Jackson,我正在用@PostMapping注释方法实现一个Spring@RestController。我想允许使用此正文的HTTP POST: {"dateTimes":[ "2017-07-19T14:25+02:00", "2017-08-19T14:25+02:00" ] } 我有一个用作@RequestBody的对象: 然而,当我尝试这一点时,我得到: Could not read JSON document: Can not construct instance of java.tim
{"dateTimes":[
"2017-07-19T14:25+02:00",
"2017-08-19T14:25+02:00"
]
}
我有一个用作@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')
如果我用字符串替换ZoneDateTime,它会工作
我使用的是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;
}
}
使用反序列化器注释的步骤如下
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private List<ZonedDateTime> dateTimes;
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;
}
}
@JsonDeserialize(using = ZonedDateTimeDeserializer.class)
private List<ZonedDateTime> dateTimes;