Estoy tratando de enviar un objeto JSON desde el front-end js a Spring Boot. Sigo recibiendo el siguiente error en Spring Boot
Resuelto [org.springframework.http.converter.HttpMessageNotReadableException: error de análisis de JSON: no se puede deserializar el valor de tipo
com.c3.healthapp.model.HeartRateEntrydel valor de matriz (tokenJsonToken.START_ARRAY); La excepción anidada es com.fasterxml.jackson.databind.exc.MismatchedInputException: no se puede deserializar el valor de tipocom.c3.healthapp.model.HeartRateEntrydel valor de matriz (tokenJsonToken.START_ARRAY)<EOL> en [Fuente: (org.springframework. util.StreamUtils$NonClosingInputStream); línea: 1, columna: 1]]
y un estado 400 en el lado del cliente.
La función Javascript que se utiliza para enviar es
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); }); }El objeto que se envía
{ entryHeartRate: 55, dateOfEntry: Tue Mar 01 2022 00:00:00 GMT+0000 (Greenwich Mean Time) }Método de controlador de arranque de primavera
@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!"); }y clase HeartRateEntry
@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; } }Hasta ahora, he podido enviar otras entidades desde formularios HTML y obtener valores (incluida una serie de entradas de frecuencia cardíaca) devueltos desde Spring Boot sin problemas.
Intenté formatear la fecha como dd/mm/yy y agregar la anotación '@JsonFormat(pattern="dd/mm/yyyy")' al atributo dateOfEntry en la clase HeartRateEntry, en caso de que haya algún problema con el análisis de fechas , pero esto no parece hacer una diferencia.
También intenté agregar un atributo de identificación al objeto JSON antes de enviarlo. Esto tampoco parece hacer una diferencia.
Tuve que crear un objeto JS nulo y agregarle los valores antes del envío. Creo que tiene que ver con el prototipo del objeto javascript que se almacena dentro del objeto creado.
let nullEntry = Object.create(null); nullEntry.entryHeartRate = entry.entryHeartRate; nullEntry.entryHeartRate = entry.dateOfEntry; saveEntryToDB(nullEntry);