簡體   English   中英

Spring Boot傑克遜java.time.Duration

[英]Spring boot jackson java.time.Duration

我已經創建了一個寧靜的Web服務,並且嘗試發送上述課程的發帖請求

public class A {
    Duration availTime;
}

public class MyRest {
    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public Response<?> test(@RequestBody A ta) {
        return new ResponseEntity<>(HttpStatus.OK);`
    }
}

原始請求主體

{
  "availTime": {
    "seconds": 5400,
    "nano": 0,
    "units": [
      "SECONDS",
      "NANOS"
    ]
  }
}

預期的json結果

 {"availTime": "PT1H30M"}

我收到了以上錯誤:無法讀取HTTP消息:

org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unexpected token (START_OBJECT),
expected one of [VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT] for java.time.Duration value; nested exception is
com.fasterxml.jackson.databind.exc.MismatchedInputException: Unexpected token (START_OBJECT), expected one of [VALUE_STRING, VALUE_NUMBER_INT, VALUE_NUMBER_FLOAT] for java.time.Duration value

異常說java.time.Duration只能從intfloatstring創建,但是您提供的是Json對象。

將您的Duration類定義為

public class Duration {

    private long seconds;
    private long nano;
    private List<String> units;

    // setters / getters
}

現在您的請求將從A類映射

編輯1
如果仍然要映射到java.time.Duration ,則需要更改請求正文。
案例1(int)

  • 請求正文

    {“ availTime”:5400}

  • 產量

    { “availTime”: “PT1H30M”}

案例2(浮動)

  • 請求正文

    {“ availTime”:5400.00}

  • 產量

    { “availTime”: “PT1H30M”}

情況3(字串)

  • 請求正文

    {“ availTime”:“ PT5400S”}

  • 產量

    { “availTime”: “PT1H30M”}

對於上述所有三種情況,添加依賴項

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jsr310</artifactId>
  <version>2.8.8</version>
</dependency>

A類應修改為

public class A {

    private Duration availTime;

    // for json output of duration as string 
    @JsonFormat(shape = Shape.STRING)
    public Duration getAvailTime() {
        return availTime;
    }

    public void setAvailTime(Duration availTime) {
        this.availTime = availTime;
    }
}

將請求正文打印為json

ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
System.out.println(mapper.writeValueAsString(ta));

如果仍然要映射現有的請求主體,則需要為Duration類編寫自定義反序列化器。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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