2016-06-22 20 views
0

Ich suche nach Lösung, wie <soapenv:Header> Teil von SOAP-Anfrage mit XML-basierten Routing (Apache Camel Blueprint XML) zu entfernen.Entfernen Sie <soapenv: Header> aus Payload in XML-Route

So diese:

<soapenv:Envelope xmlns:net="..." xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header> 
     ... 
    </soapenv:Header> 
    <soapenv:Body> 
     ... 
    </soapenv:Body> 
</soapenv:Envelope> 

wird sich nur das:

<soapenv:Envelope xmlns:net="..." xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Body> 
     ... 
    </soapenv:Body> 
</soapenv:Envelope> 

Ich glaube, ich Java-basierte Lösung gefunden, auch xslt-basierte Lösung, aber ich nicht für sie sehr geeignet finden meine Projekt, und ich hoffe immer noch, es gibt eine einfache Möglichkeit, wie Sie es direkt in XML-Route tun, ohne Java-Verarbeitungsklasse zu erstellen oder XSLT-Vorlage hinzufügen.

ich versuchte <removeHeaders pattern="_something_"/> aber entweder ich kann nicht die richtige „etwas“ oder dieser Befehl gilt herauszufinden, nur Header über Nutzinformationsabschnittes ...

Antwort

1

In Blueprint können Sie den Körper des XML mithilfe von XPATH abrufen. So etwas wie das:

<setProperty propertyName="MessageBody"> 
    <xpath>//*[local-name()='Body']</xpath> 
</setProperty> 

Dann könnten Sie Ihre Nachricht mit dem Umschlag-Tag rekonstruieren.

<setBody>   
    <simple><![CDATA[<Envelope>${property.MessageBody}</Envelope>]]></simple> 
</setBody> 

Dies funktioniert nur, wenn Ihr Envelope-Tag eine Konstante ist.

+0

scheint wie ein Plan, aber ich muss finden, wo es zu setzen ... weil an der Stelle in der Route, wo ich bearbeite, ist 'Körper' bereits auf ' soapenv: Body' content - also dieser Code leert ihn einfach ... aber 'soapenv: Header' wird irgendwie präsentiert und es wird am Ende wieder in die Antwort integriert ... Ich schätze, ich brauche mehr Analyse unseres Codes (leider ich Bin ganz neu dazu: /) – Ellrohir

0

Der einfachste Weg, ich würde Sache ist die SOAP-Nachricht zu analysieren und Entfernen Sie dann die Kopfzeile. Sie können das mit SAAJ machen. How to remove empty header from SOAP message?

.removeHeaders() ist für das Entfernen von Camel Exchange-Header, die etwas völlig anderes ist.

0

Es hängt davon ab, welches Datenformat Sie für den CXF-Endpunkt verwenden. Kommt diese SOAP-Anfrage von einem anderen Dienst?

Warum sind Sie nicht zufrieden mit XSLT?

Unabhängig davon können Sie entfernen, wenn Sie Payload DATAFORMAT verwenden.

+0

vor allem, weil t Er Beispiel XSLT-Code, den ich Copy-Paste aus Tutorials ist verursacht, dass ganze ESB beim Laden abstürzen, wie es aus irgendeinem Grund nicht gültig ist (kann nicht herausfinden, warum bis jetzt) ​​ – Ellrohir

+0

Wow, interessanter Kommentar. Ich habe an so vielen Projekten gearbeitet, bei denen wir Millionen von Nachrichten und große Datenmengen hauptsächlich mit XSLT + Apache Camel bearbeitet haben. Ich werde XSLT nicht befürworten, wenn Sie mit JSON zu tun haben, aber ich möchte nicht, dass Sie eine falsche Vorstellung davon bekommen, das ist es. Antwort von @Ewout ist auch eine gute Idee, aber es wird viele Transformationsanforderungen geben, wo XSLT helfen würde. Viel Glück. – gnanagurus

+0

Zurück zu meinem Problem nach einer Weile. Kannst du mir möglicherweise korrekten xsl Code zur Verfügung stellen, um durchzuführen, was ich tun möchte?Ich habe ein paar bis jetzt versucht, aber es hat nie gemacht, was ich erwartet habe (um nur '' tag und seinen Inhalt zu entfernen, sonst nichts). – Ellrohir

0

So finde ich perfekt und sehr einfache Lösung für mein Problem:

Den Inhalt <soapenv:Header> (zusammen mit Gehalten von <soapenv:Body>) in CxfPayload Objekt gespeichert wurden, der Teil der org.apache.camel.Exchange

ist Nachdem ich das gelernt ich war nur ein Groovy Befehl, die leicht in routes.xml aufgenommen werden können, weg von Lösung:

<groovy> 
    exchange.getIn().getBody(org.apache.camel.impl.DefaultMessage.class).getBody(org.apache.camel.component.cxf.CxfPayload.class).getHeaders().clear(); 
</groovy>