2016-11-03 6 views
1

Hey ich versuche, eine Standard-Header für mehrere Methoden in meinem @MessagingGateway zu setzen. Alle diese Methoden gehen in den gleichen Methodenkanal, also versuche ich, den Methodennamen zu verwenden, um zu bestimmen, woher die Nachricht kam. Für die Methodennamen auf den Standardkopf zuweisen, verwende ich den Spel Ausdruck #methodName nach, was ich gefunden in:Standard-Header auf @MessageGateway nicht auf der Nachricht angezeigt

https://github.com/spring-projects/spring-integration/pull/929

Hier ist das Gateway:

@MessagingGateway(defaultHeaders={@GatewayHeader(name="statusMethod", expression="#methodName")}) 
public interface LoggingGateway { 

    @Gateway(requestChannel="logStatusChannel") 
    public void logTokenStatus(@Header("pairInfo") PairInfo info, @Payload String status); 

    @Gateway(requestChannel="logStatusChannel") 
    public void logDataMessageStatus(@Header("pairInfo") PairInfo info, @Payload String status); 

} 

Aber weiter unten in der Strömung Wenn ich versuche, auf die Kopfzeile zuzugreifen, teilt mir der Fehler mit, dass die Standardkopfzeile nicht gefunden werden kann.

Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 18): Property or field 'statusMethod' cannot be found on object of type 'org.springframework.messaging.MessageHeaders' - maybe not public? 

Ich habe sogar versucht, die Standard-Header und Hinzufügen einer Kopfzeile zu jeder der Methoden. Auch das hat nicht geholfen. Ich habe versucht, anstatt #methodString, aber es auch nicht gefunden.

Keine Ahnung, ob die Java-Bean, die ich verwende, ist die genaue Übersetzung von dem, was ich in der XML-Konfiguration in der Verbindung sah.

Schätzen Sie die Hilfe.

Antwort

1

Nun, eigentlich haben Sie die falsche Quelle gelesen. Werfen Sie einen Blick in die offiziellen Documentation:

Das <header/> Element unterstützt die Expression als Alternative zum Wert. Der SpEL-Ausdruck wird ausgewertet, um den Wert des Headers zu bestimmen. Es gibt kein #root Objekt, sondern die folgenden Variablen stehen zur Verfügung:

#args - Ein Objekt, [] die Methodenargumente enthalten

#gatewayMethod - das java.reflect.Method Objekt darstellt, das Verfahren in der Service-Schnittstelle, die aufgerufen wurde, . Ein Header, der diese Variable enthält, kann später im Ablauf verwendet werden, z. B. für das Routing. Wenn Sie beispielsweise den einfachen Methodennamen weiterleiten möchten, können Sie eine Kopfzeile mit dem Ausdruck #gatewayMethod.name hinzufügen.

Die Beschreibung dieses PR spiegelt nicht die Realität wider. Es gibt so eine discussion, die an das Ziel #gatewayMethod Lösung führte:

artembilan am 23. Oktober 2013 Das Federelement

Sieht aus wie es keinen Grund gibt so viel Variablen um Methode zu haben. Es reicht gerade, um den letzten zu haben. Alle anderen können über Spel extrahiert werden: Ausdruck = "# method.name" Ausdruck = "# method.toString()"

garyrussell am 23. Oktober 2013 Das Federelement

Das stimmt, aber dann ‚I don t wie methodObject, aber wir müssen die Methode als den einfachen Namen behalten (wir könnten es im Migrationsleitfaden dokumentieren, aber ich möchte lieber den Schmerz minimieren).

Vielleicht serviceMethod?

artembilan am 23. Oktober 2013 Das Federelement

Dann gatewayMethod

garyrussell am 23. Oktober 2013 Das Federelement

: +1:

Durch die Art und Weise. Es gibt keinen benutzerdefinierten globalen statusMethod Header, nur weil ein SpEL #methodNamenull zurückgibt. Ein solcher Header ist also nicht gefüllt.

+0

'# gatewayMethod.name' hat den Trick dank gemacht :-) – alokraop

Verwandte Themen