繁体   English   中英

Spring 启动 - 无法反序列化 JSON Object 由 Fetch 发送

[英]Spring Boot - Unable to De-serialize JSON Object Sent by Fetch

我正在尝试从前端 js 发送一个 JSON object 到 Spring Boot. 我在 Spring 引导中不断收到以下错误

解决了[org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type com.c3.healthapp.model.HeartRateEntry from Array value (token JsonToken.START_ARRAY ); 嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列化类型com.c3.healthapp.model.HeartRateEntry来自数组值(标记JsonToken.START_ARRAY > [Source:org.spring ]<EOL util.StreamUtils$NonClosingInputStream); 行:1,列:1]]

以及客户端的状态 400。

用于发送的Javascript function是

function saveEntryToDB(entry){
    fetch("/customer/heartrate/save", {
      method: "POST",
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(entry)
    }).then(res => {
      console.log("User saved. response:", res);
    });
}

object 正在发送

{
entryHeartRate: 55, 
dateOfEntry: Tue Mar 01 2022 00:00:00 GMT+0000 (Greenwich Mean Time)
}

Spring 开机 controller 方法

    @PostMapping("/heartrate/save")
    public ResponseEntity<String> saveHeartRate(@RequestBody HeartRateEntry heartRateEntry) {
        String username = SecurityContextHolder.getContext().getAuthentication().getPrincipal().toString();
        Customer customer = customerService.getCustomer(username);
        customer.getHeartRateEntries().add(heartRateEntry);
        customerService.saveCustomer(customer);
        URI uri = URI.create(ServletUriComponentsBuilder.fromCurrentContextPath().path("/heartrate/save").toUriString());
        return ResponseEntity.created(uri).body("Saved!");
    }

和 HeartRateEntry class

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HeartRateEntry {
    @Id
    @GeneratedValue(strategy = IDENTITY)
    private Long entryId;
    private int entryHeartRate;
    private Date dateOfEntry;

    @Override
    public String toString() {

        return "Entry Id: " + entryId + " Entry Heart Rate: " + entryHeartRate + " Date Of Entry : " + dateOfEntry;

    }
}

到目前为止,我已经能够从 HTML forms 提交其他实体,并毫无问题地获取从 Spring 返回的值(包括心率条目数组)。

我尝试将日期格式化为 dd/mm/yy 并将注释 '@JsonFormat(pattern="dd/mm/yyyy")' 添加到 HeartRateEntry class 中的 dateOfEntry 属性,以防日期解析出现某种问题,但这似乎没有什么不同。

我还尝试在发送之前向 JSON object 添加一个 id 属性。 这似乎也没有什么区别。

我必须创建一个 null JS object 并在提交之前将值添加到其中。 我相信这与存储在创建的 object 中的 javascript object 原型有关。

let nullEntry = Object.create(null);
nullEntry.entryHeartRate = entry.entryHeartRate;
nullEntry.entryHeartRate = entry.dateOfEntry;
saveEntryToDB(nullEntry);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM