2016-04-06 5 views
1

Ich habe dieses Problem in meinem Apache Camel Code, den ich versuche, aus den letzten zwei Tagen zu lösen, aber ich konnte es nicht lösen.OnException in Camel keine benutzerdefinierte Antwort

Ich habe zwei Routen. Erste Route ist wie folgt:

public class XXXRoute1 extends RouteBuilder { 
    public void configure() { 
     String endpointUri = "cxf:/XXX; 
     String logEndpoint = "log:" + XXX() + "?level=DEBUG"; 
     from(endpointUri) 
       .to(logEndpoint).to(ROUTE2.ENDPOINT_URI) 
       .to(logEndpoint); 
    } 

Zweite Route: (Auf dem zweiten Weg, wir fangen einige Ausnahme durch OnException)

public class Route2 extends RouteBuilder { 
public void configure() throws Exception{ 
     String integrationEndpoint = "xxx.integration"; 
onException(RuntimeException.class).handled(true).onWhen(exceptionMessage().contains("Invalid")).bean(translator, "translateSomeError(${property.XXX})").end(); 

from(ENDPOINT_URI) 
. 
. 
. so on 

Nun, in meinem Fall das Objekt, das ich durch OnException bin bevöl

public SomeObjectResponse translateSomeError(Object someObject) throws Exception{ 


     SomeObjectResponse someObjectResponse = new SomeObjectResponse(); 
someObjectResponse.setError("someError"); 

     return someObjectResponse ; 
} 

jedoch in SOAP UI beim Testen erhalte ich eine leere SOAP umhüllen

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

Ich benutze CXF Komponente in Apache Kamel.

+0

Was erwarten Sie von CXF? Eine Seife "Fault"? Oder Ihre "SomeObjectResponse" -Instanz im Körper verankert? – Ralf

+0

Hallo @Ralf, ich möchte SomeObjectResponse zurückgeben. –

+0

Und 'SomeObjectResponse' kann mit JAXB gemarshallt werden? Generieren Sie Ihre Schnittstellenmodellklassen aus einem Schema? – Ralf

Antwort

0

Können Sie Ihre Route vollständig posten? Wo hast du die onException?

Auch bevor Sie Ihre benutzerdefinierte Klasse verwenden, können Sie dies versuchen? Ich will nur sicher etwas gesetzt bei OnException propagiert zurück zu CXF Endpunkt machen.

OnException (RuntimeException.class) .handled (true) .setBody() einfach ("</unerwartete Ausnahme >");

+0

Hallo Gnanagurus, ich habe versucht, SetBody, aber es gab auch eine leere Antwort. Außerdem verwende ich Onexception als erste Zeile innerhalb der configure-Methode von routebuilder. –

+0

2 Dinge, die ich vorschlagen würde: 1. Verwenden Sie Trick 2. Das klingt albern, aber versuchen Sie alle Log-Endpunkte in Ihrer Route zu entfernen und versuchen Sie es. – gnanagurus

0

Der onException() - Block scheint sich in Ihrer zweiten Route zu befinden und gehört folglich nicht zu Ihrer ersten Route.

Machen Sie den onException() -Block global oder fügen Sie ihn zu Ihrer CXF-Route hinzu, damit er im Gültigkeitsbereich ist.

+0

Hallo Ninja, ich habe bereits versucht, den Geltungsbereich global zu machen, indem ich beide Routen erweitere, die eine gemeinsame Elternklasse bilden, MyRouteBuilder, aber es hat auch nicht geholfen. Gibt es eine andere Möglichkeit, den Geltungsbereich global zu machen? –

+0

Eine gemeinsame Elternklasse wird den globalen Ausnahmeblock nicht erstellen, sondern nur zwei Instanzen davon erstellen (eine für jede Unterklassenroute). Versuchen Sie, Ihre onException() -Blöcke zu definieren und in einem einzelnen RouteBuilder zu routen, um etwas zu bekommen, das funktioniert. Alles in XML zu definieren macht es einfacher onException() global zu machen ... –