Springframework не может прочитать сообщение http

Мой интерфейс публикует объект json:

[{"FUND_CODE":"testFUND","PORTF_CODE":"testcode","CLIENT_STAT":null,"CLIENT_LOCAL_CURR":null,"CLIENT_START_DT":"2017-04-06","CLIENT_END_DT":"9998-12-31","CREATED_USER_ID":"testuser","CREATED_DATETIME":"2017-05-04","LAST_UPDATE_USER":null,"LAST_UPDATE_DT":null}]

Контроллер публикует сообщения выше json, используя:

deleteTableData = (schema: string, tableName: string, records: string[]): Observable<number> => {
    if (records.length > 0){
      const headers = new HttpHeaders({
        'Content-Type': 'application/json'
      });
      try {
        return this._http.post<number>(this.moduleUrl + '/delete?schemaName=' + schema + "&tableName = " + tableName, records, { headers: headers });
      } catch (err) {
        console.info(err);
      } 
    }
  }

Мой бэкэнд получает следующее:

@CrossOrigin
    @RequestMapping(value = "/delete", method = RequestMethod.POST)
    public ResponseEntity<RestWrapper> delete(@RequestParam String schemaName, @RequestParam String tableName, @RequestBody Json body){
        StringBuilder resStr = new StringBuilder();
        log.info("POST REQUEST RECEIVED ==> " + schemaName + " && " + tableName + " && " + body.value());

        return new ResponseEntity<>(new RestWrapper(resStr.toString()), HttpStatus.OK);
    }

ОШИБКА, который я получаю:

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of springfox.documentation.spring.web.json.Json out of START_ARRAY token

Как я могу исправить эту ошибку?

РЕДАКТИРОВАТЬ

Забыл упомянуть важное требование: я не могу создать конкретную модель данных на сервере. Необходимо обновить несколько таблиц, и список таблиц будет постепенно увеличиваться. Следовательно, мне нужен общий API для выполнения действий.

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

Ответы 3

Это потому, что вы читаете объект с неправильным классом. В RequestBody входящий json несовместим с springfox.documentation.spring.web.json.Json.

Если вы пытаетесь использовать какой-то конкретный класс по имени Json, проверьте, правильно ли вы импортировали пакет.

В качестве альтернативы вы можете создать простой DTO для тела json.

class JsonRequest {
    @JsonProperty("FUND_CODE")
    private String fundCode;

    @JsonProperty("CLIENT_STAT")
    private String clientStat;
    .
    .
    .

    @JsonProperty("LAST_UPDATE_DT")
    private String lastUpdateDt;
    .
    .
    // getters and setters if needed 
}

а затем измените на

 public ResponseEntity<RestWrapper> delete(..., @RequestBody JsonRequest jsonRequest){

Согласитесь с вашим мнением о пакете, импортированном для Json. Я пробовал с org.json.JSONObject и org.json.JSONArray, но оба дали мне пустое тело HTTP. Хорошая новость в том, что ошибка исчезла. Какой тип здесь следует использовать?

xzk 08.05.2018 10:53

Как упоминалось в ответе, вы должны создать свой собственный тип JsonRequest, чтобы вы могли сопоставить каждый атрибут с полем java. JSONArray или JSONObject не будут работать, потому что их json-представление отличается от того, что вы отправляете.

Yogesh Badke 08.05.2018 10:59

Хорошо понял. Требование здесь состоит в том, что я не могу создавать определенные модели данных, потому что интерфейс Json может иметь разные атрибуты для нескольких таблиц. Для выполнения этого действия мне нужен общий API. Я думаю, мне нужно было бы использовать обычное текстовое тело HTTP, а затем токенизировать ...

xzk 08.05.2018 11:04

Проблема решена, когда я изменил тип данных тела HTTP с Json на JsonNode

Разница Джексона JSON между JsonNode и ObjectNode

Поправьте меня, если я ошибаюсь. Я понимаю, что, поскольку у меня нет определенной модели для входящего JSON, мне придется использовать JsonNode, который является абстрактным классом.

Если кто-нибудь знает об этом больше, дайте мне знать.

Попробуй это :-

public ResponseEntity<RestWrapper> delete(..., @RequestBody JsonRequest[] jsonRequest)

а затем создайте класс pojo с правильным свойством json, например

       @JsonProperty("CREATED_DATETIME")
       private String CREATED_DATETIME;

вы получите правильный массив объектов, и я его уже использую.

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