selectline-software / selectline-api

Apache License 2.0
24 stars 5 forks source link

Fehler bei automatisch generiertem Code zu GET Documents/{Documentkey} #323

Closed AM-Sartissohn closed 1 year ago

AM-Sartissohn commented 1 year ago

Details

Steps to replicate the behavior:

Dieser Fehler betrifft nicht direkt die API, sondern tritt bei Verwendung des mittels swagger-codegen-cli erstellten Java-Codes auf. Ich vermute, dass hier die SelectLine.API.json nicht ganz korrekt ist und daher fehlerhafter Code generiert wird. Konkret:

Wir lesen über die Route GET Documents/{Documentkey} die Belegdaten eines Lieferscheins aus. Direktes Absetzen des Requests über bspw. Postman funktioniert ohne Probleme. Bei Verwendung der entsprechenden Methode aus der automatisch generierten Java-Klasse DocumentApi mittels

SelectLineErpDocumentModuleModelsDocumentReadModelWithExtraFields tmySuccessorDocument = (SelectLineErpDocumentModuleModelsDocumentReadModelWithExtraFields) docsApi.documentReadDocumentByKindAndNumberAsync("L" + belNr);

wird jedoch folgender Fehler (mit Stacktrace) geworfen:

java.lang.IllegalArgumentException: Invalid format: "2023-04-13T00:00:00+02:00" is malformed at "+02:00" at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:945) at de.selectline.client.DateTimeTypeAdapter.read(JSON.java:205) at de.selectline.client.DateTimeTypeAdapter.read(JSON.java:184) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.read(ReflectiveTypeAdapterFactory.java:116) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:216) at com.google.gson.Gson.fromJson(Gson.java:879) at com.google.gson.Gson.fromJson(Gson.java:844) at com.google.gson.Gson.fromJson(Gson.java:793) at de.selectline.client.JSON.deserialize(JSON.java:115) at de.selectline.client.ApiClient.deserialize(ApiClient.java:1014) at de.selectline.client.ApiClient.handleResponse(ApiClient.java:1265) at de.selectline.client.ApiClient.execute(ApiClient.java:1183) at de.selectline.client.api.DocumentApi.documentReadDocumentByKindAndNumberAsyncWithHttpInfo(DocumentApi.java:2464) at de.selectline.client.api.DocumentApi.documentReadDocumentByKindAndNumberAsync(DocumentApi.java:2450)

Das bemängelte Datum "2023-04-13T00:00:00+02:00" ist offenbar das Belegdatum aus der Response: ... "ExtraText": null, "Date": "2023-04-13T00:00:00+02:00", "BusinessPartner": { "BusinessPartnerReferenceNumber": "", ...

Soweit ich dies nachvollziehen kann, gibt die API also das Belegdatum (und andere Daten) mit Zeitzonen-Offset zurück, der auf Basis der SelectLine.API.json erstellte Code erwartet jedoch Daten ohne Offset. Ist die SelectLine.API.json hier ggf. nicht ganz korrekt?

MaikGoertz commented 1 year ago

Wir definieren die SelectLine.API.json nach der Swagger v2 Specification.

Der entsprechende Eintrag ist wie folgt aufgebaut:

"Date": {
    "format": "date-time",
    "description": "[Beleg.Datum]",
    "type": "string"
}

Mehr als "format": "date-time" kann unserem Wissen nach, nicht festgelegt werden.

Ein Datum wird dementsprechend nach RFC3339 formatiert. Dieses sieht auch einen Anteil für die lokale Zeitzone vor ("+02:00").

Mir scheint es eher, dass der Fehler im generierten Quelltext zu finden ist. Dieser kann die Zeitzonenangabe nicht verarbeiten. Da der Codegenerator nicht von uns entwickelt wird, können wir daran nichts ändern.

Ich sehe folgende Möglichkeiten, die man ausprobieren kann:

AM-Sartissohn commented 1 year ago

Hallo,

Der Fehler liegt im generierten Quelltext. Wir haben jetzt den generierten Code manuell angepasst. Konkret ist hier der joda.time. DateTimeFormatter in der Datei JSON.java verantwortlich. Nicht ganz sauberer Hack zur Korrektur: In der Klasse DateTimeTypeAdapter in der Methode read die Zeile

return formatter.parseDateTime(date);

ersetzen durch

try { return formatter.parseDateTime(date); } catch(java.lang.IllegalArgumentException ex) { return DateTime.parse(date); }

Vielleicht hilft das ja, wenn jemand anders auf das gleiche Problem stößt.