簡體   English   中英

Spring的ZonedDateTime列表作為請求正文

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM