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




Это потому, что вы читаете объект с неправильным классом. В 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){
Как упоминалось в ответе, вы должны создать свой собственный тип JsonRequest, чтобы вы могли сопоставить каждый атрибут с полем java. JSONArray или JSONObject не будут работать, потому что их json-представление отличается от того, что вы отправляете.
Хорошо понял. Требование здесь состоит в том, что я не могу создавать определенные модели данных, потому что интерфейс Json может иметь разные атрибуты для нескольких таблиц. Для выполнения этого действия мне нужен общий API. Я думаю, мне нужно было бы использовать обычное текстовое тело HTTP, а затем токенизировать ...
Проблема решена, когда я изменил тип данных тела HTTP с Json на JsonNode
Разница Джексона JSON между JsonNode и ObjectNode
Поправьте меня, если я ошибаюсь. Я понимаю, что, поскольку у меня нет определенной модели для входящего JSON, мне придется использовать JsonNode, который является абстрактным классом.
Если кто-нибудь знает об этом больше, дайте мне знать.
Попробуй это :-
public ResponseEntity<RestWrapper> delete(..., @RequestBody JsonRequest[] jsonRequest)
а затем создайте класс pojo с правильным свойством json, например
@JsonProperty("CREATED_DATETIME")
private String CREATED_DATETIME;
вы получите правильный массив объектов, и я его уже использую.
Согласитесь с вашим мнением о пакете, импортированном для Json. Я пробовал с org.json.JSONObject и org.json.JSONArray, но оба дали мне пустое тело HTTP. Хорошая новость в том, что ошибка исчезла. Какой тип здесь следует использовать?