Springframework не может прочитать http сообщение - PullRequest
0 голосов
/ 08 мая 2018

Мой интерфейс публикует объект 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.log(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

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

EDIT

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

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

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

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

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

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

0 голосов
/ 08 мая 2018

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

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

, а затем создайте класс pojo с соответствующим свойством json, например

       @JsonProperty("CREATED_DATETIME")
       private String CREATED_DATETIME;

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

0 голосов
/ 08 мая 2018

Это потому, что вы читаете объект с неправильным классом. В 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){
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...