You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/03/14 14:29:01 UTC

[2/2] camel git commit: CAMEL-8476: doTry should break out if fault message was set. Make setting fault message same as setting regular message on either IN or OUT. Do not force OUT anymore.

CAMEL-8476: doTry should break out if fault message was set. Make setting fault message same as setting regular message on either IN or OUT. Do not force OUT anymore.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/23a642f6
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/23a642f6
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/23a642f6

Branch: refs/heads/camel-2.15.x
Commit: 23a642f6a8db1c2d3b8ecb36b365a31ef4173cd8
Parents: b668a89
Author: Claus Ibsen <da...@apache.org>
Authored: Sat Mar 14 08:49:55 2015 +0100
Committer: Claus Ibsen <da...@apache.org>
Committed: Sat Mar 14 14:30:31 2015 +0100

----------------------------------------------------------------------
 .../apache/camel/builder/ExpressionBuilder.java |  6 +-
 .../apache/camel/builder/ProcessorBuilder.java  | 22 +++++--
 .../org/apache/camel/impl/DefaultExchange.java  |  5 +-
 .../camel/impl/DefaultExchangeHolder.java       |  6 ++
 .../camel/impl/InterceptSendToEndpoint.java     |  2 -
 .../camel/processor/OnCompletionProcessor.java  | 13 +++++
 .../apache/camel/processor/PipelineHelper.java  | 10 ++--
 .../org/apache/camel/processor/RoutingSlip.java |  5 --
 .../apache/camel/processor/TryProcessor.java    |  2 +
 .../interceptor/HandleFaultInterceptor.java     | 12 +++-
 .../org/apache/camel/util/ExchangeHelper.java   |  7 ++-
 .../apache/camel/processor/TrySetFaultTest.java | 61 ++++++++++++++++++++
 .../apache/camel/component/cxf/CxfConsumer.java |  8 ++-
 .../component/jms/EndpointMessageListener.java  | 11 ++--
 .../restlet/DefaultRestletBinding.java          |  5 +-
 .../integration/adapter/CamelTargetAdapter.java |  3 +-
 .../processor/SpringSetFaultBodyTest.java       |  7 +--
 17 files changed, 147 insertions(+), 38 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
index a31e895..c22ad80 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ExpressionBuilder.java
@@ -1110,7 +1110,8 @@ public final class ExpressionBuilder {
     public static Expression faultBodyExpression() {
         return new ExpressionAdapter() {
             public Object evaluate(Exchange exchange) {
-                return exchange.getOut().isFault() ? exchange.getOut().getBody() : null;
+                Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+                return msg.isFault() ? msg.getBody() : null;
             }
 
             @Override
@@ -1127,7 +1128,8 @@ public final class ExpressionBuilder {
     public static <T> Expression faultBodyExpression(final Class<T> type) {
         return new ExpressionAdapter() {
             public Object evaluate(Exchange exchange) {
-                return exchange.getOut().isFault() ? exchange.getOut().getBody(type) : null;
+                Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+                return msg.isFault() ? msg.getBody(type) : null;
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/builder/ProcessorBuilder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/builder/ProcessorBuilder.java b/camel-core/src/main/java/org/apache/camel/builder/ProcessorBuilder.java
index e2c88b4..25a6f9f 100644
--- a/camel-core/src/main/java/org/apache/camel/builder/ProcessorBuilder.java
+++ b/camel-core/src/main/java/org/apache/camel/builder/ProcessorBuilder.java
@@ -77,14 +77,19 @@ public final class ProcessorBuilder {
     }
 
     /**
-     * Creates a processor which sets the body of the FAULT message (FAULT must be OUT) to the value of the expression
+     * Creates a processor which sets the body of the FAULT message to the value of the expression
      */
     public static Processor setFaultBody(final Expression expression) {
         return new Processor() {
             public void process(Exchange exchange) {
                 Object newBody = expression.evaluate(exchange, Object.class);
-                exchange.getOut().setFault(true);
-                exchange.getOut().setBody(newBody);
+                if (exchange.hasOut()) {
+                    exchange.getOut().setFault(true);
+                    exchange.getOut().setBody(newBody);
+                } else {
+                    exchange.getIn().setFault(true);
+                    exchange.getIn().setBody(newBody);
+                }
             }
 
             @Override
@@ -136,14 +141,19 @@ public final class ProcessorBuilder {
     }
 
     /**
-     * Sets the header on the FAULT message (FAULT must be OUT)
+     * Sets the header on the FAULT message
      */
     public static Processor setFaultHeader(final String name, final Expression expression) {
         return new Processor() {
             public void process(Exchange exchange) {
                 Object value = expression.evaluate(exchange, Object.class);
-                exchange.getOut().setFault(true);
-                exchange.getOut().setHeader(name, value);
+                if (exchange.hasOut()) {
+                    exchange.getOut().setFault(true);
+                    exchange.getOut().setHeader(name, value);
+                } else {
+                    exchange.getIn().setFault(true);
+                    exchange.getIn().setHeader(name, value);
+                }
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
index 3045838..eb6db98 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchange.java
@@ -345,7 +345,10 @@ public final class DefaultExchange implements Exchange {
     }
 
     public boolean isFailed() {
-        return (hasOut() && getOut().isFault()) || getException() != null;
+        if (exception != null) {
+            return true;
+        }
+        return hasOut() ? getOut().isFault() : getIn().isFault();
     }
 
     public boolean isTransacted() {

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/impl/DefaultExchangeHolder.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchangeHolder.java b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchangeHolder.java
index 20bb42d..e6a277b 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultExchangeHolder.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultExchangeHolder.java
@@ -61,6 +61,7 @@ public class DefaultExchangeHolder implements Serializable {
     private String exchangeId;
     private Object inBody;
     private Object outBody;
+    private Boolean inFaultFlag = Boolean.FALSE;
     private Boolean outFaultFlag = Boolean.FALSE;
     private Map<String, Object> inHeaders;
     private Map<String, Object> outHeaders;
@@ -102,6 +103,8 @@ public class DefaultExchangeHolder implements Serializable {
             payload.outBody = checkSerializableBody("out body", exchange, exchange.getOut().getBody());
             payload.outFaultFlag = exchange.getOut().isFault();
             payload.safeSetOutHeaders(exchange);
+        } else {
+            payload.inFaultFlag = exchange.getIn().isFault();
         }
         if (includeProperties) {
             payload.safeSetProperties(exchange);
@@ -126,6 +129,9 @@ public class DefaultExchangeHolder implements Serializable {
         if (payload.inHeaders != null) {
             exchange.getIn().setHeaders(payload.inHeaders);
         }
+        if (payload.inFaultFlag != null) {
+            exchange.getIn().setFault(payload.inFaultFlag);
+        }
         if (payload.outBody != null) {
             exchange.getOut().setBody(payload.outBody);
             if (payload.outHeaders != null) {

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/impl/InterceptSendToEndpoint.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/impl/InterceptSendToEndpoint.java b/camel-core/src/main/java/org/apache/camel/impl/InterceptSendToEndpoint.java
index 2a333af..9c73ed2 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/InterceptSendToEndpoint.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/InterceptSendToEndpoint.java
@@ -132,8 +132,6 @@ public class InterceptSendToEndpoint implements Endpoint {
                     detour.process(exchange);
                 } catch (Exception e) {
                     exchange.setException(e);
-                    callback.done(true);
-                    return true;
                 }
 
                 // Decide whether to continue or not; similar logic to the Pipeline

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
index 6575cb2..e420772 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/OnCompletionProcessor.java
@@ -256,9 +256,16 @@ public class OnCompletionProcessor extends ServiceSupport implements AsyncProces
             // must use a copy as we dont want it to cause side effects of the original exchange
             final Exchange copy = prepareExchange(exchange);
             final Exception original = copy.getException();
+            final boolean originalFault = copy.hasOut() ? copy.getOut().isFault() : copy.getIn().isFault();
             // must remove exception otherwise onFailure routing will fail as well
             // the caused exception is stored as a property (Exchange.EXCEPTION_CAUGHT) on the exchange
             copy.setException(null);
+            // must clear fault otherwise onFailure routing will fail as well
+            if (copy.hasOut()) {
+                copy.getOut().setFault(false);
+            } else {
+                copy.getIn().setFault(false);
+            }
 
             if (executorService != null) {
                 executorService.submit(new Callable<Exchange>() {
@@ -276,6 +283,12 @@ public class OnCompletionProcessor extends ServiceSupport implements AsyncProces
                 doProcess(processor, copy);
                 // restore exception after processing
                 copy.setException(original);
+                // restore fault after processing
+                if (copy.hasOut()) {
+                    copy.getOut().setFault(originalFault);
+                } else {
+                    copy.getIn().setFault(originalFault);
+                }
             }
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/processor/PipelineHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/PipelineHelper.java b/camel-core/src/main/java/org/apache/camel/processor/PipelineHelper.java
index ebc5398..6c111e8 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/PipelineHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/PipelineHelper.java
@@ -17,6 +17,7 @@
 package org.apache.camel.processor;
 
 import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 import org.slf4j.Logger;
 
 import static org.apache.camel.util.ExchangeHelper.hasExceptionBeenHandledByErrorHandler;
@@ -45,12 +46,13 @@ public final class PipelineHelper {
         boolean exceptionHandled = hasExceptionBeenHandledByErrorHandler(exchange);
         if (exchange.isFailed() || exchange.isRollbackOnly() || exceptionHandled) {
             // We need to write a warning message when the exception and fault message be set at the same time
-            if (exchange.hasOut() && exchange.getOut().isFault() && exchange.getException() != null) {
+            Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+            if (msg.isFault() && exchange.getException() != null) {
                 StringBuilder sb = new StringBuilder();
                 sb.append("Message exchange has failed: " + message + " for exchange: ").append(exchange);
                 sb.append(" Warning: Both fault and exception exists on the exchange, its best practice to only set one of them.");
                 sb.append(" Exception: ").append(exchange.getException());
-                sb.append(" Fault: ").append(exchange.getOut());
+                sb.append(" Fault: ").append(msg);
                 if (exceptionHandled) {
                     sb.append(" Handled by the error handler.");
                 }
@@ -67,8 +69,8 @@ public final class PipelineHelper {
                 if (exchange.getException() != null) {
                     sb.append(" Exception: ").append(exchange.getException());
                 }
-                if (exchange.hasOut() && exchange.getOut().isFault()) {
-                    sb.append(" Fault: ").append(exchange.getOut());
+                if (msg.isFault()) {
+                    sb.append(" Fault: ").append(msg);
                 }
                 if (exceptionHandled) {
                     sb.append(" Handled by the error handler.");

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java b/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java
index 88e57db..00625d6 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/RoutingSlip.java
@@ -408,11 +408,6 @@ public class RoutingSlip extends ServiceSupport implements AsyncProcessor, Trace
      */
     private void copyOutToIn(Exchange result, Exchange source) {
         result.setException(source.getException());
-
-        if (source.hasOut() && source.getOut().isFault()) {
-            result.getOut().copyFrom(source.getOut());
-        }
-
         result.setIn(getResultMessage(source));
 
         result.getProperties().clear();

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java b/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java
index b53a14e..24cea69 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/TryProcessor.java
@@ -34,6 +34,8 @@ import org.apache.camel.util.ServiceHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.camel.processor.PipelineHelper.continueProcessing;
+
 /**
  * Implements try/catch/finally type processing
  *

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFaultInterceptor.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFaultInterceptor.java b/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFaultInterceptor.java
index 538fe88..06394c4 100644
--- a/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFaultInterceptor.java
+++ b/camel-core/src/main/java/org/apache/camel/processor/interceptor/HandleFaultInterceptor.java
@@ -19,6 +19,7 @@ package org.apache.camel.processor.interceptor;
 import org.apache.camel.AsyncCallback;
 import org.apache.camel.CamelException;
 import org.apache.camel.Exchange;
+import org.apache.camel.Message;
 import org.apache.camel.Processor;
 import org.apache.camel.processor.DelegateAsyncProcessor;
 
@@ -56,11 +57,16 @@ public class HandleFaultInterceptor extends DelegateAsyncProcessor {
      */
     protected void handleFault(Exchange exchange) {
         // Take the fault message out before we keep on going
-        if (exchange.hasOut() && exchange.getOut().isFault()) {
-            final Object faultBody = exchange.getOut().getBody();
+        Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+        if (msg.isFault()) {
+            final Object faultBody = msg.getBody();
             if (faultBody != null && exchange.getException() == null) {
                 // remove fault as we are converting it to an exception
-                exchange.setOut(null);
+                if (exchange.hasOut()) {
+                    exchange.setOut(null);
+                } else {
+                    exchange.setIn(null);
+                }
                 if (faultBody instanceof Throwable) {
                     exchange.setException((Throwable) faultBody);
                 } else {

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java b/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
index cc6836d..88905d7 100644
--- a/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
+++ b/camel-core/src/main/java/org/apache/camel/util/ExchangeHelper.java
@@ -625,7 +625,9 @@ public final class ExchangeHelper {
 
             // result could have a fault message
             if (hasFaultMessage(exchange)) {
-                return exchange.getOut().getBody();
+                Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+                answer = msg.getBody();
+                return answer;
             }
 
             // okay no fault then return the response according to the pattern
@@ -654,7 +656,8 @@ public final class ExchangeHelper {
      * @return <tt>true</tt> if fault message exists
      */
     public static boolean hasFaultMessage(Exchange exchange) {
-        return exchange.hasOut() && exchange.getOut().isFault() && exchange.getOut().getBody() != null;
+        Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+        return msg.isFault() && msg.getBody() != null;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/camel-core/src/test/java/org/apache/camel/processor/TrySetFaultTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/processor/TrySetFaultTest.java b/camel-core/src/test/java/org/apache/camel/processor/TrySetFaultTest.java
new file mode 100644
index 0000000..637b779
--- /dev/null
+++ b/camel-core/src/test/java/org/apache/camel/processor/TrySetFaultTest.java
@@ -0,0 +1,61 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.processor;
+
+import org.apache.camel.ContextTestSupport;
+import org.apache.camel.builder.RouteBuilder;
+
+public class TrySetFaultTest extends ContextTestSupport {
+
+    public void testSetFault() throws Exception {
+        getMockEndpoint("mock:a").expectedMessageCount(0);
+        getMockEndpoint("mock:b").expectedMessageCount(0);
+
+        template.requestBody("direct:start", "Hello World");
+
+        assertMockEndpointsSatisfied();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() throws Exception {
+        return new RouteBuilder() {
+            @Override
+            public void configure() throws Exception {
+                from("direct:start")
+                    .to("direct:a")
+                    .to("mock:a")
+                    .to("direct:b")
+                    .to("mock:b");
+
+                from("direct:a")
+                    .doTry()
+                        .setFaultBody(constant("Failed at A"))
+                    .doCatch(Exception.class)
+                        .to("mock:catch-a")
+                    .end();
+
+                from("direct:b")
+                    .doTry()
+                        .setFaultBody(constant("Failed at B"))
+                    .doCatch(Exception.class)
+                        .to("mock:catch-a")
+                    .end()
+                    .to("log:b");
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
----------------------------------------------------------------------
diff --git a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
index 4198dfb..fab7267 100644
--- a/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
+++ b/components/camel-cxf/src/main/java/org/apache/camel/component/cxf/CxfConsumer.java
@@ -220,8 +220,12 @@ public class CxfConsumer extends DefaultConsumer {
             private void checkFailure(org.apache.camel.Exchange camelExchange, Exchange cxfExchange) throws Fault {
                 final Throwable t;
                 if (camelExchange.isFailed()) {
-                    t = (camelExchange.hasOut() && camelExchange.getOut().isFault()) ? camelExchange.getOut()
-                        .getBody(Throwable.class) : camelExchange.getException();
+                    org.apache.camel.Message camelMsg = camelExchange.hasOut() ? camelExchange.getOut() : camelExchange.getIn();
+                    if (camelMsg.isFault()) {
+                        t = camelMsg.getBody(Throwable.class);
+                    } else {
+                        t = camelExchange.getException();
+                    }
                     cxfExchange.getInMessage().put(FaultMode.class, FaultMode.UNCHECKED_APPLICATION_FAULT);
                     if (t instanceof Fault) {
                         cxfExchange.getInMessage().put(FaultMode.class, FaultMode.CHECKED_APPLICATION_FAULT);

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
----------------------------------------------------------------------
diff --git a/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java b/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
index e1396b1..9f7778a 100644
--- a/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
+++ b/components/camel-jms/src/main/java/org/apache/camel/component/jms/EndpointMessageListener.java
@@ -185,10 +185,13 @@ public class EndpointMessageListener implements MessageListener {
                         // do not send a reply but wrap and rethrow the exception
                         rce = wrapRuntimeCamelException(exchange.getException());
                     }
-                } else if (exchange.hasOut() && exchange.getOut().isFault()) {
-                    // a fault occurred while processing
-                    body = exchange.getOut();
-                    cause = null;
+                } else {
+                    org.apache.camel.Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+                    if (msg.isFault()) {
+                        // a fault occurred while processing
+                        body = msg;
+                        cause = null;
+                    }
                 }
             } else {
                 // process OK so get the reply body if we are InOut and has a body

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
----------------------------------------------------------------------
diff --git a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
index dbc949d..35369bf 100644
--- a/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
+++ b/components/camel-restlet/src/main/java/org/apache/camel/component/restlet/DefaultRestletBinding.java
@@ -217,8 +217,9 @@ public class DefaultRestletBinding implements RestletBinding, HeaderFilterStrate
         if (exchange.isFailed()) {
             // 500 for internal server error which can be overridden by response code in header
             response.setStatus(Status.valueOf(500));
-            if (exchange.hasOut() && exchange.getOut().isFault()) {
-                out = exchange.getOut();
+            Message msg = exchange.hasOut() ? exchange.getOut() : exchange.getIn();
+            if (msg.isFault()) {
+                out = msg;
             } else {
                 // print exception as message and stacktrace
                 Exception t = exchange.getException();

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/adapter/CamelTargetAdapter.java
----------------------------------------------------------------------
diff --git a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/adapter/CamelTargetAdapter.java b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/adapter/CamelTargetAdapter.java
index 46671fd..50b1434 100644
--- a/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/adapter/CamelTargetAdapter.java
+++ b/components/camel-spring-integration/src/main/java/org/apache/camel/component/spring/integration/adapter/CamelTargetAdapter.java
@@ -73,7 +73,8 @@ public class CamelTargetAdapter extends AbstractCamelAdapter implements MessageH
         Exchange inExchange = new DefaultExchange(getCamelContext(), pattern);
         SpringIntegrationBinding.storeToCamelMessage(message, inExchange.getIn());
         Exchange outExchange = getCamelTemplate().send(getCamelEndpointUri(), inExchange);
-        if (outExchange.getOut() != null && outExchange.getOut().isFault()) {
+        org.apache.camel.Message camelMsg = outExchange.hasOut() ? outExchange.getOut() : outExchange.getIn();
+        if (camelMsg.isFault()) {
             result = true;
         }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/23a642f6/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetFaultBodyTest.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetFaultBodyTest.java b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetFaultBodyTest.java
index fa00161..f0b0f25 100644
--- a/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetFaultBodyTest.java
+++ b/components/camel-spring/src/test/java/org/apache/camel/spring/processor/SpringSetFaultBodyTest.java
@@ -33,7 +33,7 @@ public class SpringSetFaultBodyTest extends SpringTestSupport {
     }
 
     public void testSetFaultBody() throws Exception {
-        Exchange out = template.send("direct:start", new Processor() {
+        Exchange out = template.request("direct:start", new Processor() {
             @Override
             public void process(Exchange exchange) throws Exception {
                 exchange.getIn().setBody("Hello World");
@@ -41,8 +41,7 @@ public class SpringSetFaultBodyTest extends SpringTestSupport {
         });
 
         assertNotNull(out);
-        assertTrue(out.hasOut());
-        assertEquals("Bye World", out.getOut().getBody());
-        assertTrue("Should be a fault body", out.getOut().isFault());
+        assertEquals("Bye World", out.getIn().getBody());
+        assertTrue("Should be a fault body", out.getIn().isFault());
     }
 }