This is an automated email from the ASF dual-hosted git repository.

Croway pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/main by this push:
     new fd4fd273e4d1 CAMEL-24477: camel-cxf - add a muteException consumer 
option (#25742)
fd4fd273e4d1 is described below

commit fd4fd273e4d1d36c1341cc8cf08405decd8c755c
Author: Andrea Cosentino <[email protected]>
AuthorDate: Fri Aug 28 12:12:18 2026 +0200

    CAMEL-24477: camel-cxf - add a muteException consumer option (#25742)
    
    CxfConsumer built the SOAP fault from whatever reached 
Exchange.getException(),
    so the exception's message - or its class name when it had none - became the
    faultstring returned to the caller. The http consumers gained a 
muteException
    option defaulting to true in CAMEL-23651; camel-cxf had none.
    
    Muting is narrower here than in the other consumers because for a SOAP 
service
    some faults are the contract. Only an undeclared failure is replaced: a CXF
    Fault, an exception annotated @WebFault, and a Throwable or <soap:Fault>
    CxfPayload set as the message body are all still returned in full. 
checkFailure
    now separates the exception path from the body path to make that 
distinction,
    which retires extractThrowable.
    
    The stand-in has its stack trace cleared, since CXF can be configured to put
    the stack trace in the fault detail.
    
    Note this also covers framework failures: a continuationTimeout expiry no
    longer reports its timeout to the caller, so
    CxfConsumerContinuationTimeoutTest sets muteException=false.
    
    Co-authored-by: Federico Mariani <[email protected]>
---
 .../org/apache/camel/catalog/components/cxf.json   |  69 ++++++-------
 components/camel-cxf/camel-cxf-soap/pom.xml        |   6 ++
 .../component/cxf/jaxws/CxfEndpointConfigurer.java |   6 ++
 .../component/cxf/jaxws/CxfEndpointUriFactory.java |   3 +-
 .../org/apache/camel/component/cxf/jaxws/cxf.json  |  69 ++++++-------
 .../camel/component/cxf/jaxws/CxfConsumer.java     |  40 ++++++--
 .../camel/component/cxf/jaxws/CxfEndpoint.java     |  16 +++
 .../jaxws/CxfConsumerContinuationTimeoutTest.java  |  71 ++++++-------
 .../cxf/jaxws/CxfConsumerMuteExceptionTest.java    | 111 +++++++++++++++++++++
 .../ROOT/pages/camel-4x-upgrade-guide-4_23.adoc    |  32 ++++++
 .../endpoint/dsl/CxfEndpointBuilderFactory.java    |  42 ++++++++
 11 files changed, 352 insertions(+), 113 deletions(-)

diff --git 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cxf.json
 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cxf.json
index 92494c9f92ac..bf5a8ac7f9ce 100644
--- 
a/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cxf.json
+++ 
b/catalog/camel-catalog/src/generated/resources/org/apache/camel/catalog/components/cxf.json
@@ -46,39 +46,40 @@
     "address": { "index": 1, "kind": "path", "displayName": "Address", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The service publish address." },
     "dataFormat": { "index": 2, "kind": "parameter", "displayName": "Data 
Format", "group": "common", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.cxf.common.DataFormat", "enum": [ 
"PAYLOAD", "RAW", "MESSAGE", "CXF_MESSAGE", "POJO" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "POJO", "description": 
"The data type messages supported by the CXF endpoint." },
     "wrappedStyle": { "index": 3, "kind": "parameter", "displayName": "Wrapped 
Style", "group": "common", "label": "", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "The WSDL style that 
describes how parameters are represented in the SOAP body. If the value is 
false, CXF will chose the document-literal unwrapped style, If the value is 
true, CXF will chose the document- [...]
-    "bridgeErrorHandler": { "index": 4, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming  [...]
-    "exceptionHandler": { "index": 5, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By def [...]
-    "exchangePattern": { "index": 6, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "enum", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
-    "cookieHandler": { "index": 7, "kind": "parameter", "displayName": "Cookie 
Handler", "group": "producer", "label": "producer", "required": false, "type": 
"object", "javaType": "org.apache.camel.http.base.cookie.CookieHandler", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Configure a cookie handler to maintain a HTTP session" },
-    "defaultOperationName": { "index": 8, "kind": "parameter", "displayName": 
"Default Operation Name", "group": "producer", "label": "producer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option will set the 
default operationName that will be used by the CxfProducer which invokes the 
remote service." },
-    "defaultOperationNamespace": { "index": 9, "kind": "parameter", 
"displayName": "Default Operation Namespace", "group": "producer", "label": 
"producer", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "This option will set the default operationNamespace that will 
be used by the CxfProducer which invokes the remote service." },
-    "hostnameVerifier": { "index": 10, "kind": "parameter", "displayName": 
"Hostname Verifier", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
hostname verifier to be used. Use the # notation to reference a 
HostnameVerifier from the registry." },
-    "sslContextParameters": { "index": 11, "kind": "parameter", "displayName": 
"Ssl Context Parameters", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Camel SSL setting 
reference. Use the # notation to reference the SSL Context." },
-    "wrapped": { "index": 12, "kind": "parameter", "displayName": "Wrapped", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "description": "Which kind of operation that CXF 
endpoint producer will invoke" },
-    "lazyStartProducer": { "index": 13, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
-    "synchronous": { "index": 14, "kind": "parameter", "displayName": 
"Synchronous", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"description": "Sets whether synchronous processing should be strictly used" },
-    "allowStreaming": { "index": 15, "kind": "parameter", "displayName": 
"Allow Streaming", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the CXF component, when running in PAYLOAD mode, 
will DOM parse the incoming messages into DOM Elements or keep the payload as a 
javax.xml.transform.Source objec [...]
-    "bus": { "index": 16, "kind": "parameter", "displayName": "Bus", "group": 
"advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "org.apache.cxf.Bus", "deprecated": false, "autowired": false, 
"secret": false, "description": "To use a custom configured CXF Bus." },
-    "continuationTimeout": { "index": 17, "kind": "parameter", "displayName": 
"Continuation Timeout", "group": "advanced", "label": "advanced", "required": 
false, "type": "duration", "javaType": "long", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "30000", "description": 
"This option is used to set the CXF continuation timeout which could be used in 
CxfConsumer by default when the CXF server is using Jetty or Servlet 
transport." },
-    "cxfBinding": { "index": 18, "kind": "parameter", "displayName": "Cxf 
Binding", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.cxf.common.CxfBinding", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom CxfBinding to control the binding between Camel Message and CXF 
Message." },
-    "cxfConfigurer": { "index": 19, "kind": "parameter", "displayName": "Cxf 
Configurer", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.cxf.jaxws.CxfConfigurer", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option could apply 
the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer 
which supports to configure the CXF endpoint in programmatic way. User can 
configure [...]
-    "defaultBus": { "index": 20, "kind": "parameter", "displayName": "Default 
Bus", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will set the default 
bus when CXF endpoint create a bus by itself" },
-    "headerFilterStrategy": { "index": 21, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter header to and from Camel message." },
-    "mergeProtocolHeaders": { "index": 22, "kind": "parameter", "displayName": 
"Merge Protocol Headers", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether to merge protocol headers. If enabled then propagating headers between 
Camel and CXF becomes more consistent and similar. For more details see 
CAMEL-6393." },
-    "mtomEnabled": { "index": 23, "kind": "parameter", "displayName": "Mtom 
Enabled", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "To enable MTOM 
(attachments). This requires to use POJO or PAYLOAD data format mode." },
-    "properties": { "index": 24, "kind": "parameter", "displayName": 
"Properties", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "java.util.Map<java.lang.String, 
java.lang.Object>", "prefix": "properties.", "multiValue": true, "deprecated": 
false, "autowired": false, "secret": false, "description": "To set additional 
CXF options using the key\/value pairs from the Map. For example to turn on 
stacktraces in SOAP faults, properties.faultStackTra [...]
-    "schemaValidationEnabled": { "index": 25, "kind": "parameter", 
"displayName": "Schema Validation Enabled", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Enable schema validation for request and 
response. Disabled by default for performance reason" },
-    "skipPayloadMessagePartCheck": { "index": 26, "kind": "parameter", 
"displayName": "Skip Payload Message Part Check", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Sets whether SOAP message validation should be 
disabled." },
-    "loggingFeatureEnabled": { "index": 27, "kind": "parameter", 
"displayName": "Logging Feature Enabled", "group": "logging", "label": 
"logging", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "This option enables CXF Logging Feature which writes 
inbound and outbound SOAP messages to log." },
-    "loggingSizeLimit": { "index": 28, "kind": "parameter", "displayName": 
"Logging Size Limit", "group": "logging", "label": "logging", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 49152, "description": "To limit the 
total size of number of bytes the logger will output when logging feature has 
been enabled and -1 for no limit." },
-    "skipFaultLogging": { "index": 29, "kind": "parameter", "displayName": 
"Skip Fault Logging", "group": "logging", "label": "logging", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the PhaseInterceptorChain skips logging the Fault 
that it catches." },
-    "password": { "index": 30, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of password for the CXF client." },
-    "username": { "index": 31, "kind": "parameter", "displayName": "Username", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of username for the CXF client." },
-    "bindingId": { "index": 32, "kind": "parameter", "displayName": "Binding 
Id", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The bindingId for the service model to 
use." },
-    "portName": { "index": 33, "kind": "parameter", "displayName": "Port 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The endpoint name this service is 
implementing, it maps to the wsdl:portname. In the format of ns:PORT_NAME where 
ns is a namespace prefix valid at this scope." },
-    "publishedEndpointUrl": { "index": 34, "kind": "parameter", "displayName": 
"Published Endpoint Url", "group": "service", "label": "service", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option can override 
the endpointUrl that published from the WSDL which can be accessed with service 
address url plus wsd" },
-    "serviceClass": { "index": 35, "kind": "parameter", "displayName": 
"Service Class", "group": "service", "label": "service", "required": false, 
"type": "string", "javaType": "java.lang.Class<java.lang.Object>", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
class name of the SEI (Service Endpoint Interface) class which could have 
JSR181 annotation or not." },
-    "serviceName": { "index": 36, "kind": "parameter", "displayName": "Service 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The service name this service is 
implementing, it maps to the wsdl:servicename." },
-    "wsdlURL": { "index": 37, "kind": "parameter", "displayName": "Wsdl URL", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The location of the WSDL. Can be on the 
classpath, file system, or be hosted remotely." }
+    "muteException": { "index": 4, "kind": "parameter", "displayName": "Mute 
Exception", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "If enabled and an 
Exchange failed processing on the consumer side, and the exception is not a 
SOAP fault the service contract declares, the SOAP fault returned to the caller 
won't contain the exception's  [...]
+    "bridgeErrorHandler": { "index": 5, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming  [...]
+    "exceptionHandler": { "index": 6, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+    "exchangePattern": { "index": 7, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "enum", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
+    "cookieHandler": { "index": 8, "kind": "parameter", "displayName": "Cookie 
Handler", "group": "producer", "label": "producer", "required": false, "type": 
"object", "javaType": "org.apache.camel.http.base.cookie.CookieHandler", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Configure a cookie handler to maintain a HTTP session" },
+    "defaultOperationName": { "index": 9, "kind": "parameter", "displayName": 
"Default Operation Name", "group": "producer", "label": "producer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option will set the 
default operationName that will be used by the CxfProducer which invokes the 
remote service." },
+    "defaultOperationNamespace": { "index": 10, "kind": "parameter", 
"displayName": "Default Operation Namespace", "group": "producer", "label": 
"producer", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "This option will set the default operationNamespace that will 
be used by the CxfProducer which invokes the remote service." },
+    "hostnameVerifier": { "index": 11, "kind": "parameter", "displayName": 
"Hostname Verifier", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
hostname verifier to be used. Use the # notation to reference a 
HostnameVerifier from the registry." },
+    "sslContextParameters": { "index": 12, "kind": "parameter", "displayName": 
"Ssl Context Parameters", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Camel SSL setting 
reference. Use the # notation to reference the SSL Context." },
+    "wrapped": { "index": 13, "kind": "parameter", "displayName": "Wrapped", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "description": "Which kind of operation that CXF 
endpoint producer will invoke" },
+    "lazyStartProducer": { "index": 14, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "synchronous": { "index": 15, "kind": "parameter", "displayName": 
"Synchronous", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"description": "Sets whether synchronous processing should be strictly used" },
+    "allowStreaming": { "index": 16, "kind": "parameter", "displayName": 
"Allow Streaming", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the CXF component, when running in PAYLOAD mode, 
will DOM parse the incoming messages into DOM Elements or keep the payload as a 
javax.xml.transform.Source objec [...]
+    "bus": { "index": 17, "kind": "parameter", "displayName": "Bus", "group": 
"advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "org.apache.cxf.Bus", "deprecated": false, "autowired": false, 
"secret": false, "description": "To use a custom configured CXF Bus." },
+    "continuationTimeout": { "index": 18, "kind": "parameter", "displayName": 
"Continuation Timeout", "group": "advanced", "label": "advanced", "required": 
false, "type": "duration", "javaType": "long", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "30000", "description": 
"This option is used to set the CXF continuation timeout which could be used in 
CxfConsumer by default when the CXF server is using Jetty or Servlet 
transport." },
+    "cxfBinding": { "index": 19, "kind": "parameter", "displayName": "Cxf 
Binding", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.cxf.common.CxfBinding", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom CxfBinding to control the binding between Camel Message and CXF 
Message." },
+    "cxfConfigurer": { "index": 20, "kind": "parameter", "displayName": "Cxf 
Configurer", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.cxf.jaxws.CxfConfigurer", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option could apply 
the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer 
which supports to configure the CXF endpoint in programmatic way. User can 
configure [...]
+    "defaultBus": { "index": 21, "kind": "parameter", "displayName": "Default 
Bus", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will set the default 
bus when CXF endpoint create a bus by itself" },
+    "headerFilterStrategy": { "index": 22, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter header to and from Camel message." },
+    "mergeProtocolHeaders": { "index": 23, "kind": "parameter", "displayName": 
"Merge Protocol Headers", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether to merge protocol headers. If enabled then propagating headers between 
Camel and CXF becomes more consistent and similar. For more details see 
CAMEL-6393." },
+    "mtomEnabled": { "index": 24, "kind": "parameter", "displayName": "Mtom 
Enabled", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "To enable MTOM 
(attachments). This requires to use POJO or PAYLOAD data format mode." },
+    "properties": { "index": 25, "kind": "parameter", "displayName": 
"Properties", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "java.util.Map<java.lang.String, 
java.lang.Object>", "prefix": "properties.", "multiValue": true, "deprecated": 
false, "autowired": false, "secret": false, "description": "To set additional 
CXF options using the key\/value pairs from the Map. For example to turn on 
stacktraces in SOAP faults, properties.faultStackTra [...]
+    "schemaValidationEnabled": { "index": 26, "kind": "parameter", 
"displayName": "Schema Validation Enabled", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Enable schema validation for request and 
response. Disabled by default for performance reason" },
+    "skipPayloadMessagePartCheck": { "index": 27, "kind": "parameter", 
"displayName": "Skip Payload Message Part Check", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Sets whether SOAP message validation should be 
disabled." },
+    "loggingFeatureEnabled": { "index": 28, "kind": "parameter", 
"displayName": "Logging Feature Enabled", "group": "logging", "label": 
"logging", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "This option enables CXF Logging Feature which writes 
inbound and outbound SOAP messages to log." },
+    "loggingSizeLimit": { "index": 29, "kind": "parameter", "displayName": 
"Logging Size Limit", "group": "logging", "label": "logging", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 49152, "description": "To limit the 
total size of number of bytes the logger will output when logging feature has 
been enabled and -1 for no limit." },
+    "skipFaultLogging": { "index": 30, "kind": "parameter", "displayName": 
"Skip Fault Logging", "group": "logging", "label": "logging", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the PhaseInterceptorChain skips logging the Fault 
that it catches." },
+    "password": { "index": 31, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of password for the CXF client." },
+    "username": { "index": 32, "kind": "parameter", "displayName": "Username", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of username for the CXF client." },
+    "bindingId": { "index": 33, "kind": "parameter", "displayName": "Binding 
Id", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The bindingId for the service model to 
use." },
+    "portName": { "index": 34, "kind": "parameter", "displayName": "Port 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The endpoint name this service is 
implementing, it maps to the wsdl:portname. In the format of ns:PORT_NAME where 
ns is a namespace prefix valid at this scope." },
+    "publishedEndpointUrl": { "index": 35, "kind": "parameter", "displayName": 
"Published Endpoint Url", "group": "service", "label": "service", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option can override 
the endpointUrl that published from the WSDL which can be accessed with service 
address url plus wsd" },
+    "serviceClass": { "index": 36, "kind": "parameter", "displayName": 
"Service Class", "group": "service", "label": "service", "required": false, 
"type": "string", "javaType": "java.lang.Class<java.lang.Object>", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
class name of the SEI (Service Endpoint Interface) class which could have 
JSR181 annotation or not." },
+    "serviceName": { "index": 37, "kind": "parameter", "displayName": "Service 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The service name this service is 
implementing, it maps to the wsdl:servicename." },
+    "wsdlURL": { "index": 38, "kind": "parameter", "displayName": "Wsdl URL", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The location of the WSDL. Can be on the 
classpath, file system, or be hosted remotely." }
   }
 }
diff --git a/components/camel-cxf/camel-cxf-soap/pom.xml 
b/components/camel-cxf/camel-cxf-soap/pom.xml
index a2b18b797f20..64bd61ea550a 100644
--- a/components/camel-cxf/camel-cxf-soap/pom.xml
+++ b/components/camel-cxf/camel-cxf-soap/pom.xml
@@ -210,6 +210,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.assertj</groupId>
+            <artifactId>assertj-core</artifactId>
+            <scope>test</scope>
+        </dependency>
+
         <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-core</artifactId>
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointConfigurer.java
 
b/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointConfigurer.java
index 0154eb1a18da..292e6c4a15af 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointConfigurer.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointConfigurer.java
@@ -64,6 +64,8 @@ public class CxfEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "mergeProtocolHeaders": 
target.setMergeProtocolHeaders(property(camelContext, boolean.class, value)); 
return true;
         case "mtomenabled":
         case "mtomEnabled": target.setMtomEnabled(property(camelContext, 
boolean.class, value)); return true;
+        case "muteexception":
+        case "muteException": target.setMuteException(property(camelContext, 
boolean.class, value)); return true;
         case "password": target.setPassword(property(camelContext, 
java.lang.String.class, value)); return true;
         case "portname":
         case "portName": target.setPortName(property(camelContext, 
java.lang.String.class, value)); return true;
@@ -137,6 +139,8 @@ public class CxfEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "mergeProtocolHeaders": return boolean.class;
         case "mtomenabled":
         case "mtomEnabled": return boolean.class;
+        case "muteexception":
+        case "muteException": return boolean.class;
         case "password": return java.lang.String.class;
         case "portname":
         case "portName": return java.lang.String.class;
@@ -211,6 +215,8 @@ public class CxfEndpointConfigurer extends 
PropertyConfigurerSupport implements
         case "mergeProtocolHeaders": return target.isMergeProtocolHeaders();
         case "mtomenabled":
         case "mtomEnabled": return target.isMtomEnabled();
+        case "muteexception":
+        case "muteException": return target.isMuteException();
         case "password": return target.getPassword();
         case "portname":
         case "portName": return target.getPortName();
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointUriFactory.java
 
b/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointUriFactory.java
index 09e2e6c17840..bf485db336d0 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointUriFactory.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/generated/java/org/apache/camel/component/cxf/jaxws/CxfEndpointUriFactory.java
@@ -24,7 +24,7 @@ public class CxfEndpointUriFactory extends 
org.apache.camel.support.component.En
     private static final Set<String> ENDPOINT_IDENTITY_PROPERTY_NAMES;
     private static final Map<String, String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(38);
+        Set<String> props = new HashSet<>(39);
         props.add("address");
         props.add("allowStreaming");
         props.add("beanId");
@@ -48,6 +48,7 @@ public class CxfEndpointUriFactory extends 
org.apache.camel.support.component.En
         props.add("loggingSizeLimit");
         props.add("mergeProtocolHeaders");
         props.add("mtomEnabled");
+        props.add("muteException");
         props.add("password");
         props.add("portName");
         props.add("properties");
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/generated/resources/META-INF/org/apache/camel/component/cxf/jaxws/cxf.json
 
b/components/camel-cxf/camel-cxf-soap/src/generated/resources/META-INF/org/apache/camel/component/cxf/jaxws/cxf.json
index 92494c9f92ac..bf5a8ac7f9ce 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/generated/resources/META-INF/org/apache/camel/component/cxf/jaxws/cxf.json
+++ 
b/components/camel-cxf/camel-cxf-soap/src/generated/resources/META-INF/org/apache/camel/component/cxf/jaxws/cxf.json
@@ -46,39 +46,40 @@
     "address": { "index": 1, "kind": "path", "displayName": "Address", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The service publish address." },
     "dataFormat": { "index": 2, "kind": "parameter", "displayName": "Data 
Format", "group": "common", "label": "", "required": false, "type": "enum", 
"javaType": "org.apache.camel.component.cxf.common.DataFormat", "enum": [ 
"PAYLOAD", "RAW", "MESSAGE", "CXF_MESSAGE", "POJO" ], "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "POJO", "description": 
"The data type messages supported by the CXF endpoint." },
     "wrappedStyle": { "index": 3, "kind": "parameter", "displayName": "Wrapped 
Style", "group": "common", "label": "", "required": false, "type": "boolean", 
"javaType": "java.lang.Boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "The WSDL style that 
describes how parameters are represented in the SOAP body. If the value is 
false, CXF will chose the document-literal unwrapped style, If the value is 
true, CXF will chose the document- [...]
-    "bridgeErrorHandler": { "index": 4, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming  [...]
-    "exceptionHandler": { "index": 5, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By def [...]
-    "exchangePattern": { "index": 6, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "enum", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
-    "cookieHandler": { "index": 7, "kind": "parameter", "displayName": "Cookie 
Handler", "group": "producer", "label": "producer", "required": false, "type": 
"object", "javaType": "org.apache.camel.http.base.cookie.CookieHandler", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Configure a cookie handler to maintain a HTTP session" },
-    "defaultOperationName": { "index": 8, "kind": "parameter", "displayName": 
"Default Operation Name", "group": "producer", "label": "producer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option will set the 
default operationName that will be used by the CxfProducer which invokes the 
remote service." },
-    "defaultOperationNamespace": { "index": 9, "kind": "parameter", 
"displayName": "Default Operation Namespace", "group": "producer", "label": 
"producer", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "This option will set the default operationNamespace that will 
be used by the CxfProducer which invokes the remote service." },
-    "hostnameVerifier": { "index": 10, "kind": "parameter", "displayName": 
"Hostname Verifier", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
hostname verifier to be used. Use the # notation to reference a 
HostnameVerifier from the registry." },
-    "sslContextParameters": { "index": 11, "kind": "parameter", "displayName": 
"Ssl Context Parameters", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Camel SSL setting 
reference. Use the # notation to reference the SSL Context." },
-    "wrapped": { "index": 12, "kind": "parameter", "displayName": "Wrapped", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "description": "Which kind of operation that CXF 
endpoint producer will invoke" },
-    "lazyStartProducer": { "index": 13, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
-    "synchronous": { "index": 14, "kind": "parameter", "displayName": 
"Synchronous", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"description": "Sets whether synchronous processing should be strictly used" },
-    "allowStreaming": { "index": 15, "kind": "parameter", "displayName": 
"Allow Streaming", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the CXF component, when running in PAYLOAD mode, 
will DOM parse the incoming messages into DOM Elements or keep the payload as a 
javax.xml.transform.Source objec [...]
-    "bus": { "index": 16, "kind": "parameter", "displayName": "Bus", "group": 
"advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "org.apache.cxf.Bus", "deprecated": false, "autowired": false, 
"secret": false, "description": "To use a custom configured CXF Bus." },
-    "continuationTimeout": { "index": 17, "kind": "parameter", "displayName": 
"Continuation Timeout", "group": "advanced", "label": "advanced", "required": 
false, "type": "duration", "javaType": "long", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "30000", "description": 
"This option is used to set the CXF continuation timeout which could be used in 
CxfConsumer by default when the CXF server is using Jetty or Servlet 
transport." },
-    "cxfBinding": { "index": 18, "kind": "parameter", "displayName": "Cxf 
Binding", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.cxf.common.CxfBinding", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom CxfBinding to control the binding between Camel Message and CXF 
Message." },
-    "cxfConfigurer": { "index": 19, "kind": "parameter", "displayName": "Cxf 
Configurer", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.cxf.jaxws.CxfConfigurer", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option could apply 
the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer 
which supports to configure the CXF endpoint in programmatic way. User can 
configure [...]
-    "defaultBus": { "index": 20, "kind": "parameter", "displayName": "Default 
Bus", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will set the default 
bus when CXF endpoint create a bus by itself" },
-    "headerFilterStrategy": { "index": 21, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter header to and from Camel message." },
-    "mergeProtocolHeaders": { "index": 22, "kind": "parameter", "displayName": 
"Merge Protocol Headers", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether to merge protocol headers. If enabled then propagating headers between 
Camel and CXF becomes more consistent and similar. For more details see 
CAMEL-6393." },
-    "mtomEnabled": { "index": 23, "kind": "parameter", "displayName": "Mtom 
Enabled", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "To enable MTOM 
(attachments). This requires to use POJO or PAYLOAD data format mode." },
-    "properties": { "index": 24, "kind": "parameter", "displayName": 
"Properties", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "java.util.Map<java.lang.String, 
java.lang.Object>", "prefix": "properties.", "multiValue": true, "deprecated": 
false, "autowired": false, "secret": false, "description": "To set additional 
CXF options using the key\/value pairs from the Map. For example to turn on 
stacktraces in SOAP faults, properties.faultStackTra [...]
-    "schemaValidationEnabled": { "index": 25, "kind": "parameter", 
"displayName": "Schema Validation Enabled", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Enable schema validation for request and 
response. Disabled by default for performance reason" },
-    "skipPayloadMessagePartCheck": { "index": 26, "kind": "parameter", 
"displayName": "Skip Payload Message Part Check", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Sets whether SOAP message validation should be 
disabled." },
-    "loggingFeatureEnabled": { "index": 27, "kind": "parameter", 
"displayName": "Logging Feature Enabled", "group": "logging", "label": 
"logging", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "This option enables CXF Logging Feature which writes 
inbound and outbound SOAP messages to log." },
-    "loggingSizeLimit": { "index": 28, "kind": "parameter", "displayName": 
"Logging Size Limit", "group": "logging", "label": "logging", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 49152, "description": "To limit the 
total size of number of bytes the logger will output when logging feature has 
been enabled and -1 for no limit." },
-    "skipFaultLogging": { "index": 29, "kind": "parameter", "displayName": 
"Skip Fault Logging", "group": "logging", "label": "logging", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the PhaseInterceptorChain skips logging the Fault 
that it catches." },
-    "password": { "index": 30, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of password for the CXF client." },
-    "username": { "index": 31, "kind": "parameter", "displayName": "Username", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of username for the CXF client." },
-    "bindingId": { "index": 32, "kind": "parameter", "displayName": "Binding 
Id", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The bindingId for the service model to 
use." },
-    "portName": { "index": 33, "kind": "parameter", "displayName": "Port 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The endpoint name this service is 
implementing, it maps to the wsdl:portname. In the format of ns:PORT_NAME where 
ns is a namespace prefix valid at this scope." },
-    "publishedEndpointUrl": { "index": 34, "kind": "parameter", "displayName": 
"Published Endpoint Url", "group": "service", "label": "service", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option can override 
the endpointUrl that published from the WSDL which can be accessed with service 
address url plus wsd" },
-    "serviceClass": { "index": 35, "kind": "parameter", "displayName": 
"Service Class", "group": "service", "label": "service", "required": false, 
"type": "string", "javaType": "java.lang.Class<java.lang.Object>", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
class name of the SEI (Service Endpoint Interface) class which could have 
JSR181 annotation or not." },
-    "serviceName": { "index": 36, "kind": "parameter", "displayName": "Service 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The service name this service is 
implementing, it maps to the wsdl:servicename." },
-    "wsdlURL": { "index": 37, "kind": "parameter", "displayName": "Wsdl URL", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The location of the WSDL. Can be on the 
classpath, file system, or be hosted remotely." }
+    "muteException": { "index": 4, "kind": "parameter", "displayName": "Mute 
Exception", "group": "consumer", "label": "consumer", "required": false, 
"type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": true, "description": "If enabled and an 
Exchange failed processing on the consumer side, and the exception is not a 
SOAP fault the service contract declares, the SOAP fault returned to the caller 
won't contain the exception's  [...]
+    "bridgeErrorHandler": { "index": 5, "kind": "parameter", "displayName": 
"Bridge Error Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Allows for bridging the consumer to the 
Camel routing Error Handler, which mean any exceptions (if possible) occurred 
while the Camel consumer is trying to pickup incoming  [...]
+    "exceptionHandler": { "index": 6, "kind": "parameter", "displayName": 
"Exception Handler", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "object", "javaType": 
"org.apache.camel.spi.ExceptionHandler", "optionalPrefix": "consumer.", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
let the consumer use a custom ExceptionHandler. Notice if the option 
bridgeErrorHandler is enabled then this option is not in use. By def [...]
+    "exchangePattern": { "index": 7, "kind": "parameter", "displayName": 
"Exchange Pattern", "group": "consumer (advanced)", "label": 
"consumer,advanced", "required": false, "type": "enum", "javaType": 
"org.apache.camel.ExchangePattern", "enum": [ "InOnly", "InOut" ], 
"deprecated": false, "autowired": false, "secret": false, "description": "Sets 
the exchange pattern when the consumer creates an exchange." },
+    "cookieHandler": { "index": 8, "kind": "parameter", "displayName": "Cookie 
Handler", "group": "producer", "label": "producer", "required": false, "type": 
"object", "javaType": "org.apache.camel.http.base.cookie.CookieHandler", 
"deprecated": false, "autowired": false, "secret": false, "description": 
"Configure a cookie handler to maintain a HTTP session" },
+    "defaultOperationName": { "index": 9, "kind": "parameter", "displayName": 
"Default Operation Name", "group": "producer", "label": "producer", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option will set the 
default operationName that will be used by the CxfProducer which invokes the 
remote service." },
+    "defaultOperationNamespace": { "index": 10, "kind": "parameter", 
"displayName": "Default Operation Namespace", "group": "producer", "label": 
"producer", "required": false, "type": "string", "javaType": 
"java.lang.String", "deprecated": false, "autowired": false, "secret": false, 
"description": "This option will set the default operationNamespace that will 
be used by the CxfProducer which invokes the remote service." },
+    "hostnameVerifier": { "index": 11, "kind": "parameter", "displayName": 
"Hostname Verifier", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": "javax.net.ssl.HostnameVerifier", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
hostname verifier to be used. Use the # notation to reference a 
HostnameVerifier from the registry." },
+    "sslContextParameters": { "index": 12, "kind": "parameter", "displayName": 
"Ssl Context Parameters", "group": "producer", "label": "producer", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.support.jsse.SSLContextParameters", "deprecated": false, 
"autowired": false, "secret": false, "description": "The Camel SSL setting 
reference. Use the # notation to reference the SSL Context." },
+    "wrapped": { "index": 13, "kind": "parameter", "displayName": "Wrapped", 
"group": "producer", "label": "producer", "required": false, "type": "boolean", 
"javaType": "boolean", "deprecated": false, "autowired": false, "secret": 
false, "defaultValue": false, "description": "Which kind of operation that CXF 
endpoint producer will invoke" },
+    "lazyStartProducer": { "index": 14, "kind": "parameter", "displayName": 
"Lazy Start Producer", "group": "producer (advanced)", "label": 
"producer,advanced", "required": false, "type": "boolean", "javaType": 
"boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Whether the producer should be started 
lazy (on the first message). By starting lazy you can use this to allow 
CamelContext and routes to startup in situations where a produ [...]
+    "synchronous": { "index": 15, "kind": "parameter", "displayName": 
"Synchronous", "group": "producer (advanced)", "label": "producer,advanced", 
"required": false, "type": "boolean", "javaType": "boolean", "deprecated": 
false, "autowired": false, "secret": false, "defaultValue": false, 
"description": "Sets whether synchronous processing should be strictly used" },
+    "allowStreaming": { "index": 16, "kind": "parameter", "displayName": 
"Allow Streaming", "group": "advanced", "label": "advanced", "required": false, 
"type": "boolean", "javaType": "java.lang.Boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the CXF component, when running in PAYLOAD mode, 
will DOM parse the incoming messages into DOM Elements or keep the payload as a 
javax.xml.transform.Source objec [...]
+    "bus": { "index": 17, "kind": "parameter", "displayName": "Bus", "group": 
"advanced", "label": "advanced", "required": false, "type": "object", 
"javaType": "org.apache.cxf.Bus", "deprecated": false, "autowired": false, 
"secret": false, "description": "To use a custom configured CXF Bus." },
+    "continuationTimeout": { "index": 18, "kind": "parameter", "displayName": 
"Continuation Timeout", "group": "advanced", "label": "advanced", "required": 
false, "type": "duration", "javaType": "long", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": "30000", "description": 
"This option is used to set the CXF continuation timeout which could be used in 
CxfConsumer by default when the CXF server is using Jetty or Servlet 
transport." },
+    "cxfBinding": { "index": 19, "kind": "parameter", "displayName": "Cxf 
Binding", "group": "advanced", "label": "advanced", "required": false, "type": 
"object", "javaType": "org.apache.camel.component.cxf.common.CxfBinding", 
"deprecated": false, "autowired": false, "secret": false, "description": "To 
use a custom CxfBinding to control the binding between Camel Message and CXF 
Message." },
+    "cxfConfigurer": { "index": 20, "kind": "parameter", "displayName": "Cxf 
Configurer", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": 
"org.apache.camel.component.cxf.jaxws.CxfConfigurer", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option could apply 
the implementation of org.apache.camel.component.cxf.CxfEndpointConfigurer 
which supports to configure the CXF endpoint in programmatic way. User can 
configure [...]
+    "defaultBus": { "index": 21, "kind": "parameter", "displayName": "Default 
Bus", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "Will set the default 
bus when CXF endpoint create a bus by itself" },
+    "headerFilterStrategy": { "index": 22, "kind": "parameter", "displayName": 
"Header Filter Strategy", "group": "advanced", "label": "advanced", "required": 
false, "type": "object", "javaType": 
"org.apache.camel.spi.HeaderFilterStrategy", "deprecated": false, "autowired": 
false, "secret": false, "description": "To use a custom HeaderFilterStrategy to 
filter header to and from Camel message." },
+    "mergeProtocolHeaders": { "index": 23, "kind": "parameter", "displayName": 
"Merge Protocol Headers", "group": "advanced", "label": "advanced", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"Whether to merge protocol headers. If enabled then propagating headers between 
Camel and CXF becomes more consistent and similar. For more details see 
CAMEL-6393." },
+    "mtomEnabled": { "index": 24, "kind": "parameter", "displayName": "Mtom 
Enabled", "group": "advanced", "label": "advanced", "required": false, "type": 
"boolean", "javaType": "boolean", "deprecated": false, "autowired": false, 
"secret": false, "defaultValue": false, "description": "To enable MTOM 
(attachments). This requires to use POJO or PAYLOAD data format mode." },
+    "properties": { "index": 25, "kind": "parameter", "displayName": 
"Properties", "group": "advanced", "label": "advanced", "required": false, 
"type": "object", "javaType": "java.util.Map<java.lang.String, 
java.lang.Object>", "prefix": "properties.", "multiValue": true, "deprecated": 
false, "autowired": false, "secret": false, "description": "To set additional 
CXF options using the key\/value pairs from the Map. For example to turn on 
stacktraces in SOAP faults, properties.faultStackTra [...]
+    "schemaValidationEnabled": { "index": 26, "kind": "parameter", 
"displayName": "Schema Validation Enabled", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": 
"java.lang.Boolean", "deprecated": false, "autowired": false, "secret": false, 
"defaultValue": false, "description": "Enable schema validation for request and 
response. Disabled by default for performance reason" },
+    "skipPayloadMessagePartCheck": { "index": 27, "kind": "parameter", 
"displayName": "Skip Payload Message Part Check", "group": "advanced", "label": 
"advanced", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "Sets whether SOAP message validation should be 
disabled." },
+    "loggingFeatureEnabled": { "index": 28, "kind": "parameter", 
"displayName": "Logging Feature Enabled", "group": "logging", "label": 
"logging", "required": false, "type": "boolean", "javaType": "boolean", 
"deprecated": false, "autowired": false, "secret": false, "defaultValue": 
false, "description": "This option enables CXF Logging Feature which writes 
inbound and outbound SOAP messages to log." },
+    "loggingSizeLimit": { "index": 29, "kind": "parameter", "displayName": 
"Logging Size Limit", "group": "logging", "label": "logging", "required": 
false, "type": "integer", "javaType": "int", "deprecated": false, "autowired": 
false, "secret": false, "defaultValue": 49152, "description": "To limit the 
total size of number of bytes the logger will output when logging feature has 
been enabled and -1 for no limit." },
+    "skipFaultLogging": { "index": 30, "kind": "parameter", "displayName": 
"Skip Fault Logging", "group": "logging", "label": "logging", "required": 
false, "type": "boolean", "javaType": "boolean", "deprecated": false, 
"autowired": false, "secret": false, "defaultValue": false, "description": 
"This option controls whether the PhaseInterceptorChain skips logging the Fault 
that it catches." },
+    "password": { "index": 31, "kind": "parameter", "displayName": "Password", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of password for the CXF client." },
+    "username": { "index": 32, "kind": "parameter", "displayName": "Username", 
"group": "security", "label": "security", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": true, "security": "secret", "description": "This option is used to 
set the basic authentication information of username for the CXF client." },
+    "bindingId": { "index": 33, "kind": "parameter", "displayName": "Binding 
Id", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The bindingId for the service model to 
use." },
+    "portName": { "index": 34, "kind": "parameter", "displayName": "Port 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The endpoint name this service is 
implementing, it maps to the wsdl:portname. In the format of ns:PORT_NAME where 
ns is a namespace prefix valid at this scope." },
+    "publishedEndpointUrl": { "index": 35, "kind": "parameter", "displayName": 
"Published Endpoint Url", "group": "service", "label": "service", "required": 
false, "type": "string", "javaType": "java.lang.String", "deprecated": false, 
"autowired": false, "secret": false, "description": "This option can override 
the endpointUrl that published from the WSDL which can be accessed with service 
address url plus wsd" },
+    "serviceClass": { "index": 36, "kind": "parameter", "displayName": 
"Service Class", "group": "service", "label": "service", "required": false, 
"type": "string", "javaType": "java.lang.Class<java.lang.Object>", 
"deprecated": false, "autowired": false, "secret": false, "description": "The 
class name of the SEI (Service Endpoint Interface) class which could have 
JSR181 annotation or not." },
+    "serviceName": { "index": 37, "kind": "parameter", "displayName": "Service 
Name", "group": "service", "label": "service", "required": false, "type": 
"string", "javaType": "java.lang.String", "deprecated": false, "autowired": 
false, "secret": false, "description": "The service name this service is 
implementing, it maps to the wsdl:servicename." },
+    "wsdlURL": { "index": 38, "kind": "parameter", "displayName": "Wsdl URL", 
"group": "service", "label": "service", "required": false, "type": "string", 
"javaType": "java.lang.String", "deprecated": false, "autowired": false, 
"secret": false, "description": "The location of the WSDL. Can be on the 
classpath, file system, or be hosted remotely." }
   }
 }
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfConsumer.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfConsumer.java
index 16b63a98c308..b636b78b3726 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfConsumer.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfConsumer.java
@@ -153,6 +153,7 @@ public class CxfConsumer extends DefaultConsumer implements 
Suspendable {
     private class CxfConsumerInvoker implements Invoker {
 
         private static final String COMPLETED = 
"org.apache.camel.component.cxf.jaxws.completed";
+        private static final String MUTED_FAULT_MESSAGE = "Exchange processing 
failed";
 
         private final CxfEndpoint endpoint;
 
@@ -359,12 +360,17 @@ public class CxfConsumer extends DefaultConsumer 
implements Suspendable {
         }
 
         private void checkFailure(org.apache.camel.Exchange camelExchange, 
Exchange cxfExchange) throws Fault {
-            final Throwable t = extractThrowable(camelExchange);
+            // an exception set on the exchange is a route failure; one 
carried in the body is a fault the route
+            // chose to return, and stays part of the contract either way
+            final Throwable routeFailure = camelExchange.getException();
+            final Throwable t = routeFailure != null ? routeFailure : 
extractFromBody(camelExchange, null);
 
             if (t != null) {
                 cxfExchange.getInMessage().put(FaultMode.class, 
FaultMode.UNCHECKED_APPLICATION_FAULT);
                 if (t instanceof Fault fault) {
                     handleFault(cxfExchange, fault);
+                } else if (routeFailure != null && isMuted(t)) {
+                    buildFaultFromThrowable(mutedThrowable());
                 } else {
                     // This is not a CXF Fault. Build the CXF Fault manually.
                     buildFaultFromThrowable(t);
@@ -373,6 +379,26 @@ public class CxfConsumer extends DefaultConsumer 
implements Suspendable {
             }
         }
 
+        /**
+         * Only an <em>undeclared</em> route failure is muted. An exception 
the service contract declares - annotated
+         * {@code @WebFault} - is what a SOAP client is written against, so 
suppressing it would break the contract
+         * rather than protect anything.
+         */
+        private boolean isMuted(Throwable t) {
+            return ((CxfEndpoint) getEndpoint()).isMuteException()
+                    && t.getClass().getAnnotation(WebFault.class) == null;
+        }
+
+        /**
+         * Carries no class name, no message and no stack trace of the route's 
exception: CXF copies the message into
+         * the SOAP faultstring, and can be configured to put the stack trace 
in the fault detail.
+         */
+        private static Throwable mutedThrowable() {
+            Exception muted = new Exception(MUTED_FAULT_MESSAGE);
+            muted.setStackTrace(new StackTraceElement[0]);
+            return muted;
+        }
+
         private static void buildFaultFromThrowable(Throwable t) {
             Fault fault = new Fault(t);
             if (fault.getMessage() == null) {
@@ -410,15 +436,9 @@ public class CxfConsumer extends DefaultConsumer 
implements Suspendable {
             throw t;
         }
 
-        private static Throwable extractThrowable(org.apache.camel.Exchange 
camelExchange) {
-            Throwable t = camelExchange.getException();
-            if (t == null) {
-                // SOAP faults can be stored as exceptions as message body (to 
be backwards compatible)
-                t = extractFromBody(camelExchange, t);
-            }
-            return t;
-        }
-
+        /**
+         * SOAP faults can be stored as exceptions as message body (to be 
backwards compatible).
+         */
         private static Throwable extractFromBody(org.apache.camel.Exchange 
camelExchange, Throwable t) {
             Object body = camelExchange.getMessage().getBody();
             if (body instanceof Throwable throwable) {
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
index 3c68352c8dd7..3deb088a40d4 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/main/java/org/apache/camel/component/cxf/jaxws/CxfEndpoint.java
@@ -203,6 +203,8 @@ public class CxfEndpoint extends DefaultEndpoint implements 
AsyncEndpoint, Heade
     private boolean skipPayloadMessagePartCheck;
     @UriParam(label = "logging")
     private boolean skipFaultLogging;
+    @UriParam(label = "consumer", defaultValue = "true")
+    private boolean muteException = true;
     @UriParam(label = "advanced")
     private boolean mergeProtocolHeaders;
     @UriParam(label = "advanced")
@@ -1458,6 +1460,20 @@ public class CxfEndpoint extends DefaultEndpoint 
implements AsyncEndpoint, Heade
         this.skipFaultLogging = skipFaultLogging;
     }
 
+    public boolean isMuteException() {
+        return muteException;
+    }
+
+    /**
+     * If enabled and an Exchange failed processing on the consumer side, and 
the exception is not a SOAP fault the
+     * service contract declares, the SOAP fault returned to the caller won't 
contain the exception's class or message.
+     * Faults the route raises deliberately - a CXF {@code Fault}, an 
exception annotated {@code @WebFault}, or a
+     * {@code Throwable} set as the message body - are part of the contract 
and are always returned in full.
+     */
+    public void setMuteException(boolean muteException) {
+        this.muteException = muteException;
+    }
+
     public boolean isMergeProtocolHeaders() {
         return mergeProtocolHeaders;
     }
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerContinuationTimeoutTest.java
 
b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerContinuationTimeoutTest.java
index da7c70a50440..8c505d3a9175 100644
--- 
a/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerContinuationTimeoutTest.java
+++ 
b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerContinuationTimeoutTest.java
@@ -62,42 +62,45 @@ public class CxfConsumerContinuationTimeoutTest extends 
CamelTestSupport {
                         .setBody(constant("Sensitive Data"))
                         .to(simpleEndpointURI + 
"&continuationTimeout=5000&dataFormat=RAW");
 
-                from(simpleEndpointURI + 
"&continuationTimeout=5000&dataFormat=RAW").process(new AsyncProcessorSupport() 
{
-                    @Override
-                    public boolean process(Exchange exchange, AsyncCallback 
asyncCallback) {
-                        Message in = exchange.getIn();
-                        // check the content-length header is filtered
-                        Object value = in.getHeader("Content-Length");
-                        assertNull(value, "The Content-Length header should be 
removed");
-                        // Get the request message
-                        String request = in.getBody(String.class);
-                        String priority = in.getHeader("priority", "fast", 
String.class);
-
-                        // need not to block this thread to simulate slow 
response so use a thread pool to wait
-                        if ("slow".equalsIgnoreCase(priority)) {
-                            pool.submit(() -> {
-                                try {
-                                    log.info("Sleeping for 10 seconds to 
simulate slow response");
-                                    Thread.sleep(10000);
-                                } catch (InterruptedException e) {
-                                    // ignore
-                                } finally {
-                                    asyncCallback.done(false);
+                // muteException=false: these tests assert the 
continuation-timeout message reaches the caller,
+                // which CAMEL-24477 otherwise replaces with a generic fault
+                from(simpleEndpointURI + 
"&continuationTimeout=5000&dataFormat=RAW&muteException=false")
+                        .process(new AsyncProcessorSupport() {
+                            @Override
+                            public boolean process(Exchange exchange, 
AsyncCallback asyncCallback) {
+                                Message in = exchange.getIn();
+                                // check the content-length header is filtered
+                                Object value = in.getHeader("Content-Length");
+                                assertNull(value, "The Content-Length header 
should be removed");
+                                // Get the request message
+                                String request = in.getBody(String.class);
+                                String priority = in.getHeader("priority", 
"fast", String.class);
+
+                                // need not to block this thread to simulate 
slow response so use a thread pool to wait
+                                if ("slow".equalsIgnoreCase(priority)) {
+                                    pool.submit(() -> {
+                                        try {
+                                            log.info("Sleeping for 10 seconds 
to simulate slow response");
+                                            Thread.sleep(10000);
+                                        } catch (InterruptedException e) {
+                                            // ignore
+                                        } finally {
+                                            asyncCallback.done(false);
+                                        }
+                                    });
+                                    return false;
+                                } else {
+                                    // Send the response message back
+                                    if (request.indexOf(ECHO_METHOD) > 0) {
+                                        
exchange.getMessage().setBody(ECHO_RESPONSE);
+                                    } else { // echoBoolean call
+                                        
exchange.getMessage().setBody(ECHO_BOOLEAN_RESPONSE);
+                                    }
                                 }
-                            });
-                            return false;
-                        } else {
-                            // Send the response message back
-                            if (request.indexOf(ECHO_METHOD) > 0) {
-                                exchange.getMessage().setBody(ECHO_RESPONSE);
-                            } else { // echoBoolean call
-                                
exchange.getMessage().setBody(ECHO_BOOLEAN_RESPONSE);
+                                asyncCallback.done(true);
+                                return true;
                             }
-                        }
-                        asyncCallback.done(true);
-                        return true;
-                    }
-                });
+                        });
             }
         };
     }
diff --git 
a/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerMuteExceptionTest.java
 
b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerMuteExceptionTest.java
new file mode 100644
index 000000000000..d9c964b3d870
--- /dev/null
+++ 
b/components/camel-cxf/camel-cxf-soap/src/test/java/org/apache/camel/component/cxf/jaxws/CxfConsumerMuteExceptionTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.component.cxf.jaxws;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.cxf.common.CXFTestSupport;
+import org.apache.camel.test.junit6.CamelTestSupport;
+import org.apache.cxf.frontend.ClientFactoryBean;
+import org.apache.cxf.greeter_control.Greeter;
+import org.apache.cxf.greeter_control.PingMeFault;
+import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+/**
+ * The consumer used to put the route exception's message into the SOAP fault 
returned to the caller, so any
+ * remote-triggerable failure handed the caller internal detail.
+ * <p>
+ * {@code muteException} defaults to true, matching the http consumers aligned 
by CAMEL-23651. It applies only to
+ * <em>undeclared</em> failures: an exception the service contract declares 
with {@code @WebFault} is what a SOAP client
+ * is written against, so it is still returned in full.
+ */
+class CxfConsumerMuteExceptionTest extends CamelTestSupport {
+
+    private static final String DETAIL = 
"the-internal-detail-a-caller-must-not-see";
+
+    private static final String MUTED_ADDRESS
+            = "http://localhost:"; + CXFTestSupport.getPort1() + 
"/CxfConsumerMuteExceptionTest/muted";
+    private static final String UNMUTED_ADDRESS
+            = "http://localhost:"; + CXFTestSupport.getPort2() + 
"/CxfConsumerMuteExceptionTest/unmuted";
+    private static final String DECLARED_ADDRESS
+            = "http://localhost:"; + CXFTestSupport.getPort3() + 
"/CxfConsumerMuteExceptionTest/declared";
+
+    private static final String SERVICE_CLASS = 
"serviceClass=org.apache.cxf.greeter_control.Greeter";
+
+    @Test
+    void anUndeclaredFailureIsNotDescribedToTheCaller() {
+        assertThatThrownBy(() -> client(MUTED_ADDRESS).pingMe())
+                .as("the SOAP fault must carry neither the class nor the 
message of the route's exception")
+                .hasMessageNotContaining(DETAIL)
+                .hasMessageNotContaining("IllegalStateException");
+    }
+
+    @Test
+    void muteExceptionFalseDescribesTheFailureAsBefore() {
+        assertThatThrownBy(() -> client(UNMUTED_ADDRESS).pingMe())
+                .hasMessageContaining(DETAIL);
+    }
+
+    /**
+     * The guarantee that makes muting safe to default on: a fault the WSDL 
declares is part of the contract, so muting
+     * must not touch it. Without this carve-out every SOAP client written 
against a declared fault would break.
+     */
+    @Test
+    void aDeclaredWebFaultIsStillReturnedInFullWhileMuted() {
+        assertThatThrownBy(() -> client(DECLARED_ADDRESS).pingMe())
+                .isInstanceOf(PingMeFault.class)
+                .hasMessageContaining(DETAIL);
+    }
+
+    @Test
+    void muteExceptionDefaultsToTrue() {
+        CxfEndpoint endpoint = context.getEndpoint("cxf://" + MUTED_ADDRESS + 
"?" + SERVICE_CLASS, CxfEndpoint.class);
+        assertThat(endpoint.isMuteException()).isTrue();
+    }
+
+    private static Greeter client(String address) {
+        JaxWsProxyFactoryBean proxyFactory = new JaxWsProxyFactoryBean();
+        ClientFactoryBean clientBean = proxyFactory.getClientFactoryBean();
+        clientBean.setAddress(address);
+        clientBean.setServiceClass(Greeter.class);
+        return (Greeter) proxyFactory.create();
+    }
+
+    @Override
+    protected RouteBuilder createRouteBuilder() {
+        return new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("cxf://" + MUTED_ADDRESS + "?" + SERVICE_CLASS)
+                        .process(e -> {
+                            throw new IllegalStateException(DETAIL);
+                        });
+                from("cxf://" + UNMUTED_ADDRESS + "?" + SERVICE_CLASS + 
"&muteException=false")
+                        .process(e -> {
+                            throw new IllegalStateException(DETAIL);
+                        });
+                from("cxf://" + DECLARED_ADDRESS + "?" + SERVICE_CLASS)
+                        .process(e -> {
+                            throw new PingMeFault(DETAIL);
+                        });
+            }
+        };
+    }
+}
diff --git 
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc 
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
index 74b7f414031b..f73ec650e792 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_23.adoc
@@ -689,6 +689,38 @@ Deployments whose introspection endpoint omits `iss` must 
either have it include
 `validateIssuer` off. The locally verified JWT path is unaffected — it uses 
Keycloak's own
 `TokenVerifier.RealmUrlCheck`.
 
+=== camel-cxf
+
+The CXF consumer no longer describes an undeclared route failure in the SOAP 
fault returned to the caller.
+
+When a route consuming from `cxf:` failed with an exception the service 
contract does not declare, the
+exception's message — or its class name, when it had no message — became the 
SOAP `faultstring`. A new
+`muteException` consumer option controls this, and it defaults to `true`, the 
same default the HTTP
+consumers carry (`camel-http-common` and therefore `camel-servlet` and 
`camel-jetty`, plus `camel-http`,
+`camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 
4.21.0).
+
+Muting applies **only to undeclared failures**. Faults the route raises 
deliberately are part of the
+service contract and are still returned in full:
+
+* a CXF `Fault` or `SoapFault` thrown by the route,
+* an exception annotated `@WebFault` (a fault the WSDL declares),
+* a `Throwable` or a `CxfPayload` carrying a `<soap:Fault>` set as the message 
body.
+
+Only an exception that reaches `Exchange.getException()` without a `@WebFault` 
annotation is replaced,
+by a fault reading `Exchange processing failed`.
+
+Note that this includes framework failures, not just route exceptions. In 
particular, a `continuationTimeout`
+expiry previously returned `The OUT message was not received within: 5000 
millis.` to the caller and now
+returns the generic fault; set `muteException=false` on that endpoint if the 
timeout detail is relied upon
+for diagnostics.
+
+A route that relies on an undeclared exception's message reaching the caller 
must opt back in explicitly:
+
+[source,text]
+----
+cxf://http://localhost:8080/service?serviceClass=com.example.MyService&muteException=false
+----
+
 === camel-thrift
 
 The `thrift` data format used to deserialize into its own `defaultInstance` 
and return that object to
diff --git 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CxfEndpointBuilderFactory.java
 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CxfEndpointBuilderFactory.java
index f0c09a1c0cad..63ecb3b889b1 100644
--- 
a/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CxfEndpointBuilderFactory.java
+++ 
b/dsl/camel-endpointdsl/src/generated/java/org/apache/camel/builder/endpoint/dsl/CxfEndpointBuilderFactory.java
@@ -113,6 +113,48 @@ public interface CxfEndpointBuilderFactory {
             doSetProperty("wrappedStyle", wrappedStyle);
             return this;
         }
+        /**
+         * If enabled and an Exchange failed processing on the consumer side,
+         * and the exception is not a SOAP fault the service contract declares,
+         * the SOAP fault returned to the caller won't contain the exception's
+         * class or message. Faults the route raises deliberately - a CXF 
Fault,
+         * an exception annotated {code WebFault}, or a Throwable set as the
+         * message body - are part of the contract and are always returned in
+         * full.
+         * 
+         * The option is a: <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         * 
+         * @param muteException the value to set
+         * @return the dsl builder
+         */
+        default CxfEndpointConsumerBuilder muteException(boolean 
muteException) {
+            doSetProperty("muteException", muteException);
+            return this;
+        }
+        /**
+         * If enabled and an Exchange failed processing on the consumer side,
+         * and the exception is not a SOAP fault the service contract declares,
+         * the SOAP fault returned to the caller won't contain the exception's
+         * class or message. Faults the route raises deliberately - a CXF 
Fault,
+         * an exception annotated {code WebFault}, or a Throwable set as the
+         * message body - are part of the contract and are always returned in
+         * full.
+         * 
+         * The option will be converted to a <code>boolean</code> type.
+         * 
+         * Default: true
+         * Group: consumer
+         * 
+         * @param muteException the value to set
+         * @return the dsl builder
+         */
+        default CxfEndpointConsumerBuilder muteException(String muteException) 
{
+            doSetProperty("muteException", muteException);
+            return this;
+        }
         /**
          * This option enables CXF Logging Feature which writes inbound and
          * outbound SOAP messages to log.

Reply via email to