Das JSON-Feld (jsonData) ging während des asynchronen HTTP-POST zwischen Spring Boot-Apps zeitweise verloren, keine FehlJava

Java-Forum
Anonymous
 Das JSON-Feld (jsonData) ging während des asynchronen HTTP-POST zwischen Spring Boot-Apps zeitweise verloren, keine Fehl

Post by Anonymous »

🎯 Ziel und Diskrepanz
Wenn Operation Platform A Daten an die Schnittstelle von Datenplattform B überträgt, fehlt bei einigen Daten das Feld „jsonData“, was dazu führt, dass Plattform B eine Ausnahme „Anforderungsparameter enthalten keine JSON-Daten“ auslöst. Darüber hinaus fehlen die Fehlerprotokolle von Plattform A.
📝 Umgebungsbeschreibung und Problemsymptome
  • Umgebung: Beinhaltet zwei Java Spring Boot-Anwendungen: Plattform A (Datensender) und Plattform B (Datenempfänger).

    Plattform A-Logik: Empfängt ein MeterReadingData-Objekt und speichert es auf der Plattform Die Datenbanktabelle „a“ von A wird dann über dataPlatformReaderDataService.sendReaderDataToDataPlatform(meterReadingData) asynchron an Plattform B weitergeleitet. Beim Pushen wird das Objekt in einen JSON-String serialisiert und gesendet.
  • Logik der Plattform B: Empfängt eine POST-Anfrage mit dem Anfragetext als String str und versucht dann, sie mit JSONObject.parseObject(str, ReaderDataDTO.class) zu analysieren. Nach dem Parsen wird die Geschäftsverarbeitung über „readerDataService.analysisAndSaveData(readerDataDTO) durchgeführt, was eine Ausnahme vom Typ „com.ruoyi.common.Exception.base.CheckException: Anforderungsparameter enthalten keine JSON-Daten“ auslöst (diese Ausnahme tritt auf, weil im Objekt „ReaderDataDTO“ das Feld „jsonData“ fehlt).
[*]Symptome:
  • Plattform-B-Ausnahmephänomen: Plattform-B-Protokolle zeichnen die Ausnahme „Anforderungsparameter enthalten keine JSON-Daten“ auf. Das Fehlerprotokoll lautet wie folgt (beachten Sie das fehlende Feld jsonData):

    Code: Select all

    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
    
    Bei der Überprüfung der Daten für diese IMEI zu diesem bestimmten Zeitpunkt in der Datenbanktabelle „a“ wurde jedoch festgestellt, dass der Dateneintrag normal war (anhand dieser Daten konnte das Problem nicht lokal reproduziert werden).
  • Beispiel für normale Daten: Die in der Datenbank gespeicherte normale MeterReadingData-Struktur (die das Feld jsonData enthält) lautet wie folgt:

    Code: Select all

    {
    "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"
    }
    
  • Fehlende Plattform-A-Protokolle: Wenn Plattform B die Ausnahme „Anforderungsparameter enthalten keine JSON-Daten“ auslöst, enthalten die Protokolle von Plattform A nicht das Fehlerprotokoll „Ausnahme beim Pushen von Zählerstandsdaten an Datenplattform aufgetreten (Zählerstandsdaten-Push an Datenplattform aufgetreten Ausnahme) und auch die Zählerstandsdaten konnten nicht an Datenplattform übertragen werden, zurückgegebenes Ergebnis:{} (Zählerstandsdaten data{} konnten nicht auf die Datenplattform übertragen werden, zurückgegebenes Ergebnis:{}) Fehlerprotokoll. Plattform A kann andere von Plattform B ausgelöste Ausnahmen normal protokollieren.

💻 Relevante Codefragmente
1. Plattform B – Empfangsschnittstelle (Wo die Ausnahme auftritt)

Code: Select all

@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. Plattform A – Sendelogik (Schlüsselmethoden)

Code: Select all

// 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: Select all

// 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), //

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post