gpt4 book ai didi

java - Spring Boot jackson java.time.Duration

转载 作者:行者123 更新时间:2023-12-01 05:45:27 27 4
gpt4 key购买 nike

我创建了一个安静的网络服务,我尝试发送上述类的 post 请求

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

最佳答案

异常(exception)情况是 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)
  • 请求正文

    {
    “可用时间”:5400
  • 输出

    {"availTime":"PT1H30M"}

  • 案例 2( float )
  • 请求正文

    {
    “可用时间”: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 类编写自定义反序列化器。

    希望能帮助到你。

    关于java - Spring Boot jackson java.time.Duration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50194771/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com