Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Spring的ZoneDateTime作为请求主体的列表_Java_Spring_Spring Boot_Jackson - Fatal编程技术网

Java 带Spring的ZoneDateTime作为请求主体的列表

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

我正在用@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.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;