2017-09-18 5 views
0

Wir programmieren einen MULE REST-Service, der in mehrere Schichten unterteilt ist.MULE 3.7.0 C.E. - BufferInputStream-Payload wird zu String

Die API-Schicht (RAML-basiert) empfängt eingehende Anfragen und bereitet einige flowVars vor, damit die unteren Schichten wissen, wie sie vorgehen müssen.

Die zweite Schicht ist ebenfalls servicedefiniert, daher gibt es für jeden Service einen Fluss.

Schließlich enthält die dritte Schicht einen eindeutigen Fluss und ist derjenige, der abhängig von den in der oberen Schicht konfigurierten flowVars einen Anruf ausführt, der eine HTTP-Anforderungskomponente für den benötigten Drittanbieterdienst verwendet.

In dieser dritten Schicht werden einige Audit-Register erstellt, um zu wissen, was wir senden und was wir erhalten. Daher muss unsere Audit-Komponente (ein benutzerdefinierter MULE-Connector) den Inhalt der Payload in unsere Datenbank schreiben, so dass ein message.getPayloadAsString() (oder Ähnliches) benötigt wird. Wenn wir einen sauberen Getter verwenden (wie message.getPayload()), wird nur der Datentyp erhalten und somit in die Datenbank geschrieben.

Das Problem liegt genau hier. Jede einzelne empfangene Nutzinformation scheint ein BufferInputStream zu sein, und bei der Ausführung der message.getPayloadAsString() scheint ein innerer Casting die Nutzlast zu beeinflussen. Dies wäre normalerweise kein Problem außer für einen der Fälle, die wir gefunden haben: einer der Dienste, die wir aufrufen, gibt eine PNG-Datei zurück, so message.getPayloadAsString() verwandelt es in einen String und bricht das Bild.

Wir haben versucht, die Payload zu kopieren, um eine der Kopien vor dem Casting zu schützen, aber als Objekt implementiert sie keine Cloneable-Schnittstelle; wir haben versucht, eine Kopie der Nutzlast auf eine andere Art zu erstellen, aber nur eine neue Referenz wird erzeugt; wir haben versucht, die Payload zu serialisieren, um eine neue Kopie aus den serialisierten Daten zu erstellen, aber das Objekt implementiert keine serialisierbare Schnittstelle ... Alles nutzlos.

Jede Hilfe, Idee oder Ratschlag wäre willkommen.

+0

Danke, @ AndrewKoropets für die Bearbeitung der Formatierung in der Post. Ich habe nicht einmal bemerkt, dass es falsch war. :-) –

Antwort

0

Wir haben es schließlich geschafft, das Problem zu lösen, indem wir message.getPayloadAsBytes(); verwenden, der Rückgabewert ist ein brandneues Byte [] -Objekt. Diese Methode ändert die Nutzdaten in der Nachricht nicht. Durch den Byte-Array verwenden, können wir ein String-Objekt geschrieben werden in unserer Prüfung wie folgt erstellen:

byte[] auditByteArray[] = message.getPayloadAsBytes(); 
String auditString = new String(auditByteArray); 

Außerdem haben wir einen Test versucht, die darin besteht, stablishing dass Byte-Array als die neue Nutzlast in der Nachricht und sowohl JSON und PNG-Antworten werden vom Browser korrekt verwaltet.

Verwandte Themen