Весенняя загрузка Джексона java.time. Продолжительность - PullRequest
0 голосов
/ 06 мая 2018

Я создал спокойный веб-сервис, и я пытаюсь отправить запрос по почте вышеупомянутым классом

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

1 Ответ

0 голосов
/ 06 мая 2018

Как говорит исключение, java.time.Duration может быть создано только из int, float или string, но вы предоставляете объект Json.

Определите свой класс продолжительности как

public class Duration {

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

    // setters / getters
}

Теперь ваш запрос будет сопоставлен с классом A

Редактировать 1
Если вы все еще хотите отобразить на java.time.Duration, вам нужно изменить тело запроса.
Дело 1 (int)

  • Тело запроса

    { "utilTime": 5400 }

  • выход

    { "availTime": "PT1H30M"}

Случай 2 (с плавающей точкой)

  • Тело запроса

    { "utilTime": 5400,00 }

  • выход

    { "availTime": "PT1H30M"}

Случай 3 (строка)

  • Тело запроса

    { "utilTime": "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.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...