繁体   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