Поле JSON (jsonData) периодически теряется во время асинхронного HTTP POST между приложениями Spring Boot, на стороне отJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Поле JSON (jsonData) периодически теряется во время асинхронного HTTP POST между приложениями Spring Boot, на стороне от

Сообщение Anonymous »

🎯 Цель и несоответствие
Когда платформа операции 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), выглядит следующим образом:

    Код: Выделить всё

    {
    "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");
}
2. Платформа A — отправка логики (ключевые методы)

Код: Выделить всё

// 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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»