Когда платформа операции A передает данные в интерфейс платформы данных B, в некоторых данных отсутствует поле jsonData, в результате чего платформа B выдает исключение «Параметры запроса не содержат данных JSON». Кроме того, отсутствуют журналы ошибок платформы A.
- Среда: Включает два приложения Java Spring Boot: платформу A (отправитель данных) и платформу B (приемник данных).
Логика платформы A: получает объект MeterReadingData, сохраняет его в таблицу базы данных «a» платформы A, а затем асинхронно передает ее на платформу B через dataPlatformReaderDataService.sendReaderDataToDataPlatform(meterReadingData). Во время отправки объект сериализуется в строку JSON и отправляется. - Логика платформы B: Получает запрос POST с телом запроса в виде строки str, затем пытается проанализировать его с помощью JSONObject.parseObject(str, ReaderDataDTO.class). После синтаксического анализа бизнес-обработка выполняется через readDataService.analysisAndSaveData(readerDataDTO), который выдает исключение com.ruoyi.common.Exception.base.CheckException: Параметры запроса не содержат данных JSON (это исключение возникает из-за того, что в объекте ReaderDataDTO отсутствует поле jsonData).
- Явление исключения платформы B: В журналах платформы B записано исключение «Параметры запроса не содержат данных JSON».. Журнал ошибок выглядит следующим образом (обратите внимание на отсутствующее поле jsonData):
Однако при проверке данных для этого IMEI в этот конкретный момент в таблице базы данных «a» было обнаружено, что ввод данных был нормальным (при использовании этих данных проблема не могла быть воспроизведена локально).
Код: Выделить всё
2025-12-03 08:30:00,425 [ERROR] [http-nio-10001-exec-93] com.ruoyi.project.manage.controller.ReaderDataController [receiveReaderData : 47] Error processing meter reading data data:{"batteryLevel":720,"dataSource":"NBAEP","eventTime":1764721534000,"imei":"868658067381844","intervalFlowStartingTime":1764691200000,"meterNum":"241025184","meterType":225,"pulseUnit":1,"readTime":1764691200000,"rsrp":-94,"snr":3,"totalFlow":430},imei:868658067381844 com.ruoyi.common.exception.base.CheckException: Request parameters do not contain JSON data - Пример нормальных данных: Обычная структура MeterReadingData, сохраненная в базе данных (содержащая поле jsonData), выглядит следующим образом:
Код: Выделить всё
{ "analysisType": 0, "createTime": "2025-11-11T23:55:37.19", "dataId": 212894670, "dataSource": "NBAEP", "hexBytes": "", "id": 3474100508, "imei": "861969072357100", "jsonData": "{\"csq\": 0, \"ecl\": 2, \"snr\": -80, \"imei\": \"861969072357100\", \"rsrp\": -132, \"valve\": 0, \"dataId\": 212894670, \"battery\": 3.66, \"records\": [\"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\", \"366_0\"], \"interval\": 60, \"meterNum\": \"0060102241000382\", \"eventTime\": \"2025-11-11 15:24:38\", \"meterType\": 302, \"pulseUnit\": 1, \"startTime\": \"2025-11-06 10:00:00\", \"totalFlow\": 366, \"deviceType\": \"MaiTuoMeter\", \"readingTime\": \"2025-11-11 15:23:42\"}", "moduleTime": "2025-11-11T00:01:33", "platformTime": "2025-11-11T23:55:37.174" } - Отсутствуют журналы платформы A: Когда платформа B выдает исключение «Параметры запроса не содержат данных JSON», журналы платформы A не содержат исключение, возникшее при передаче данных показаний счетчика на платформу данных (исключение при отправке данных счетчика на платформу данных), а также журнал ошибок данных показаний счетчика{} не удалось отправить на платформу данных, возвращается результат:{} (данные показаний счетчика{} не удалось отправить на платформу данных, возвращен результат:{}) журнал ошибок. Платформа A может нормально регистрировать другие исключения, создаваемые платформой B.
1. Платформа B – интерфейс приема (где возникает исключение)
Код: Выделить всё
@PostMapping("/save")
public AjaxResult receiveReaderData(@RequestBody String str) {
ReaderDataDTO readerDataDTO = JSONObject.parseObject(str, ReaderDataDTO.class);
try {
readerDataService.analysisAndSaveData(readerDataDTO);
} catch (SaveDataException e) {
// ... Omitted SaveDataException catch block
} catch (Exception e) {
// Error log printing location (where it appears)
logger.error("Error processing meter reading data data:{},imei:{}", str, readerDataDTO.getImei(), e);
return AjaxResult.error("Error processing meter reading data" + e.getMessage());
}
return AjaxResult.success("Meter reading data saved successfully");
}
Код: Выделить всё
// Sending interface
@RequestMapping(method = RequestMethod.POST, value = "insert")
public ApiResult saveData(@RequestBody MeterReadingData meterReadingData){
Long a = System.currentTimeMillis();
int ret = 0;
String imei = meterReadingData.getImei();
if (meterReadingData != null &&StringUtils.isNotBlank(imei)) {
meterReadingData.setCreateTime(new Date());
ret = meterReadingDataService.insert(meterReadingData);// {
try {
meterInfoService.updateReadingSourceByImei(imei,meterReadingData.getDataSource());
}catch (Exception e) {
LOG.info("Exception updating basic info reading source",e);
}
}).start();
// Directly push meter reading data to data platform, no data processing
dataPlatformReaderDataService.sendReaderDataToDataPlatform(meterReadingData);
LOG.info(imei+"============{}(ms)", System.currentTimeMillis()-a);
return ApiResult.success();
} else {
LOG.info("Creation failed=======IMEI======"+imei);
return ApiResult.fail(1203, "create failed");
}
}
return ApiResult.fail(1101, "params empty");
}
Код: Выделить всё
// Core sending method
@Override
public Future sendReaderDataToDataPlatform(MeterReadingData meterReadingData) {
try {
// ... (omitted configuration query code)
if (thirdApiConfig != null && StringUtils.isNotBlank(thirdApiConfig.getApiUrl())) {
// Serialize the entire object into a JSON string as the request body
JSONObject jsonObject = ApiUtils.syncApiRequest(
thirdApiConfig.getApiUrl() + METER_READING_READER_DATA,
null,
null,
JSON.toJSONString(meterReadingData), //
Подробнее здесь: [url]https://stackoverflow.com/questions/79836597/json-field-jsondata-intermittently-lost-during-async-http-post-between-spring[/url]