Spring: вложенный объект не десериализуется

Отправляю POST-запрос с углового на весенний. Его десериализация в основном выполняется правильно, но один вложенный объект десериализуется как пустой объект.

Мои интерфейсы Angular выглядят следующим образом:

// ClientMedicalModal.ts
export interface ClientMedicalModal {
  clientMedicalId: number;
  client: ClientModel;
  medicalEvidence: MedicalEvidence;
}

// ClientModal.ts
export interface ClientModal {
  clientId: number;
}

// MedicalEvidenceModal.ts
export interface MedicalEvidenceModal {
  B001: string;
  B003: string;
  B004: string;
}

Мои Java-объекты выглядят так:

public class ClientMedical implements Serializable {
  private Integer clientMedicalId;
  private Client client;
  private MedicalEvidence medicalEvidence;

  // getter and setter
}

public class Client implements Serializable {
  private Integer clientId;

  // getter and setter
}

public class MedicalEvidence implements Serializable {
  private String B001;
  private String B003;
  private String B004;
  
  public String getB001() {
    return B001;
  }

  public MedicalEvidence setB001(String b001) {
    B001 = b001;
  }
  // all other getter and setter
}

Когда я проверяю сообщение в своем браузере, все в порядке: {"medicalEvidence":{"B001":"Test","B003":"TestMessage","B004":"Whatever"},"client":{"clientId":1}}

Отладка в Spring Я получаю запрос, есть Client-Object с clientId = 1, но ClientEvidence-Object пуст, все поля B00 * равны нулю. См. Здесь значения отладки

Привязка формы Spring связывает параметры формы с соответствующими полями для класса Client, но MedicalEvidence пусто, поэтому Spring создает экземпляр нового класса MedicalEvidence со всеми полями, имеющими нулевые значения. Почему параметры привязываются не к полям класса MedicalEvidence, а к классу клиента (и ко всем другим классам, которые я использую таким же образом)? Кстати. Это тоже не сработает, если я просто отправлю MedicalEvidence из Angular. Параметры объекта по-прежнему пусты.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
22
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте использовать b001, b002, .. в качестве имен, первая буква не должна быть прописной в вашем варианте использования, за исключением того, что вы хотите использовать некоторую аннотацию. И используйте «это». в методе установки.

public class MedicalEvidence implements Serializable {
  private String b001;
  private String b003;
  private String b004;
                 ^^^^
  
  public String getB001() {
    return b001;
  }

  public MedicalEvidence setB001(String b001) {
    this.b001 = b001;
    ^^^^^
  }

Это сработало отлично, почему?

xosidat546 30.03.2021 22:13

Другие вопросы по теме