Цель и несоответствие
Когда платформа операции 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):
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
Однако при проверке данных для этого IMEI в этот конкретный момент в таблице базы данных «a» было обнаружено, что ввод данных был нормальным (при использовании этих данных проблема не могла быть воспроизведена локально).
Пример нормальных данных: Обычная структура MeterReadingData, сохраненная в базе данных (содержащая поле jsonData), выглядит следующим образом:
Отсутствуют журналы платформы A: Когда платформа B выдает исключение «Параметры запроса не содержат данных JSON», журналы платформы A не содержат исключение, возникшее при передаче данных показаний счетчика на платформу данных (исключение при отправке данных счетчика на платформу данных), а также журнал ошибок данных показаний счетчика{} не удалось отправить на платформу данных, возвращается результат:{} (данные показаний счетчика{} не удалось отправить на платформу данных, возвращен результат:{}) журнал ошибок. Платформа A может нормально регистрировать другие исключения, создаваемые платформой B.
Соответствующие фрагменты кода 1. Платформа B – интерфейс приема (где возникает исключение)
🎯 Цель и несоответствие Когда платформа операции A передает данные в интерфейс платформы данных B, в некоторых данных отсутствует поле jsonData, в результате чего платформа B выдает исключение «Параметры запроса не содержат данных JSON». Кроме того, отсутствуют журналы ошибок платформы A. 📝 Описание среды и симптомы проблемы [list] [*][b]Среда:[/b] Включает два приложения Java Spring Boot: платформу A (отправитель данных) и платформу B (приемник данных).
[b]Логика платформы A:[/b] получает объект MeterReadingData, сохраняет его в таблицу базы данных «a» платформы A, а затем асинхронно передает ее на платформу B через dataPlatformReaderDataService.sendReaderDataToDataPlatform(meterReadingData). Во время отправки объект сериализуется в строку JSON и отправляется. [*][b]Логика платформы B:[/b] Получает запрос POST с телом запроса в виде строки str, затем пытается проанализировать его с помощью JSONObject.parseObject(str, ReaderDataDTO.class). После синтаксического анализа бизнес-обработка выполняется через readDataService.analysisAndSaveData(readerDataDTO), который выдает исключение com.ruoyi.common.Exception.base.CheckException: Параметры запроса не содержат данных JSON (это исключение возникает из-за того, что в объекте ReaderDataDTO отсутствует поле jsonData). [/list]
[*][b]Признаки:[/b] [list] [b]Явление исключения платформы B:[/b] В журналах платформы B записано исключение «Параметры запроса не содержат данных JSON».. Журнал ошибок выглядит следующим образом (обратите внимание на отсутствующее поле jsonData): [code]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 [/code] Однако при проверке данных для этого IMEI в этот конкретный момент в таблице базы данных «a» было обнаружено, что ввод данных был нормальным (при использовании этих данных проблема не могла быть воспроизведена локально). [*][b]Пример нормальных данных:[/b] Обычная структура MeterReadingData, сохраненная в базе данных (содержащая поле jsonData), выглядит следующим образом: [code]{ "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" } [/code]
[*][b]Отсутствуют журналы платформы A:[/b] Когда платформа B выдает исключение «Параметры запроса не содержат данных JSON», журналы платформы A [b]не[/b] содержат исключение, возникшее при передаче данных показаний счетчика на платформу данных (исключение при отправке данных счетчика на платформу данных), а также журнал ошибок данных показаний счетчика{} не удалось отправить на платформу данных, возвращается результат:{} (данные показаний счетчика{} не удалось отправить на платформу данных, возвращен результат:{}) журнал ошибок. Платформа A может нормально регистрировать другие исключения, создаваемые платформой B. [/list]
💻 Соответствующие фрагменты кода [b]1. Платформа B – интерфейс приема[/b] (где возникает исключение) [code]@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"); } [/code] [b]2. Платформа A — отправка логики (ключевые методы)[/b] [code]// 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"); } [/code] [code]// 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), //