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):
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:
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)
🎯 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 [list] [*][b]Umgebung:[/b] Beinhaltet zwei Java Spring Boot-Anwendungen: Plattform A (Datensender) und Plattform B (Datenempfänger).
[b]Plattform A-Logik:[/b] 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. [*][b]Logik der Plattform B:[/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). [/list]
[*][b]Symptome:[/b] [list] [b]Plattform-B-Ausnahmephänomen:[/b] Plattform-B-Protokolle zeichnen die Ausnahme „Anforderungsparameter enthalten keine JSON-Daten“ auf. Das Fehlerprotokoll lautet wie folgt (beachten Sie das fehlende Feld 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] 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 [url=viewtopic.php?t=26065]Problem[/url] nicht lokal reproduziert werden). [*][b]Beispiel für normale Daten:[/b] Die in der Datenbank gespeicherte normale MeterReadingData-Struktur (die das Feld jsonData enthält) lautet wie folgt: [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]Fehlende Plattform-A-Protokolle:[/b] Wenn Plattform B die Ausnahme „Anforderungsparameter enthalten keine JSON-Daten“ auslöst, enthalten die Protokolle von Plattform A [b]nicht[/b] 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. [/list]
💻 Relevante Codefragmente [b]1. Plattform B – Empfangsschnittstelle[/b] (Wo die Ausnahme auftritt) [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. Plattform A – Sendelogik (Schlüsselmethoden)[/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), //
Ich mache also ein Tutorial, das einen Teil über asynchrones JavaScript enthält. Ich habe das Gefühl, dass ich es ziemlich gut verstanden habe, aber es enthält diesen Abschnitt, der meiner Meinung...