Apache Camel 4.x Upgrade Guide
This document is for helping you upgrade your Apache Camel application from Camel 4.x to 4.y. For example, if you are upgrading Camel 4.0 to 4.2, then you should follow the guides from both 4.0 to 4.1 and 4.1 to 4.2.
| The Camel Upgrade Recipes project provides automated assistance for some common migration tasks. Note that manual migration is still required. See the documentation page for details. |
Upgrading from 4.18.1 to 4.18.3
camel-core
The org.apache.camel.support.DefaultHeaderFilterStrategy changed default setting for lowercase from false to true.
camel-jms
JMS ObjectMessage support is now disabled by default. Java object serialization is a recurring source of security issues, and Camel JMS routes rarely use ObjectMessage in practice. The component will now refuse to create or read jakarta.jms.ObjectMessage instances unless the new objectMessageEnabled option is explicitly set to true.
This affects the following endpoint/component options that rely on ObjectMessage internally:
-
jmsMessageType=Object(or sending aSerializablebody that is auto-detected asObject) -
transferExchange=true -
transferException=true -
receiving a JMS
ObjectMessageproduced by an external sender
To restore the previous behavior, enable the option at the component or endpoint level:
camel.component.jms.objectMessageEnabled=true Or, on a single endpoint:
jms:queue:foo?objectMessageEnabled=true camel-sjms / camel-sjms2
The same default applies to camel-sjms (and camel-sjms2, which inherits from it): JMS ObjectMessage support is now disabled by default and gated by a new objectMessageEnabled option (default false) on SjmsComponent / SjmsEndpoint.
This affects the same endpoint/component options as camel-jms:
-
jmsMessageType=Object(or sending aSerializablebody that is auto-detected asObject) -
transferException=true -
receiving a JMS
ObjectMessageproduced by an external sender
To restore the previous behavior, enable the option at the component or endpoint level:
camel.component.sjms.objectMessageEnabled=true
camel.component.sjms2.objectMessageEnabled=true Or, on a single endpoint:
sjms:queue:foo?objectMessageEnabled=true
sjms2:queue:foo?objectMessageEnabled=true camel-aws-bedrock
The applyGuardrail producer operation now reads the guardrail identifier from a new dedicated header CamelAwsBedrockGuardrailIdentifier (constant BedrockConstants.GUARDRAIL_IDENTIFIER, typed String) instead of CamelAwsBedrockGuardrailConfig. The CamelAwsBedrockGuardrailConfig header is typed GuardrailConfiguration and is reserved for the converse and converseStream operations; the previous code path silently produced null whenever a route mixed converse and applyGuardrail calls. If you were not setting the guardrail identifier via header, the endpoint-level guardrailIdentifier option continues to work without changes.
camel-hazelcast
Hazelcast instances created and managed by Camel (when no user-supplied Config or HazelcastInstance is provided) now apply a default JavaSerializationFilterConfig on the SerializationConfig of the Config built by Camel. The default whitelists the class name prefixes java., javax., org.apache.camel. and blacklists java.net..
This affects:
-
camel-hazelcastcomponent endpoints when neitherhazelcastInstance,hazelcastConfigUri, nor a referencedConfigis supplied -
HazelcastAggregationRepositoryandHazelcastIdempotentRepositorywhen nohazelcastInstanceis supplied -
HazelcastUtil#newInstance()(no-arg)
A user-supplied JavaSerializationFilterConfig (set on the SerializationConfig of a Config provided via hazelcastConfigUri, a referenced Config bean, or already wired into a pre-built HazelcastInstance) is respected and is not overwritten.
Applications that store classes outside the default whitelist on a Hazelcast topic, queue, map, list, set, or in one of the repositories above must provide their own Config with a JavaSerializationFilterConfig configured for their class names.
camel-jgroups - potential breaking change
The Exchange header constants in JGroupsConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
This is a breaking change for routes that read or write these headers by their literal string value. Routes that reference the constant symbolically (for example setHeader(JGroupsConstants.HEADER_JGROUPS_DEST, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("JGROUPS_DEST", …)) must be updated to use the new value (setHeader("CamelJGroupsDest", …)).
camel-lucene
The Exchange header values exposed by LuceneConstants have been renamed to follow the standard Camel naming convention. The field names are unchanged, so routes referencing the constants (LuceneConstants.HEADER_QUERY, LuceneConstants.HEADER_RETURN_LUCENE_DOCS) continue to work without modification. However, routes that set or read these headers using the raw string values must be updated:
-
QUERY→CamelLuceneQuery -
RETURN_LUCENE_DOCS→CamelLuceneReturnLuceneDocs
As a consequence, the generated Endpoint DSL header accessors on LuceneHeaderNameBuilder have been renamed accordingly:
-
qUERY()→luceneQuery() -
returnLuceneDocs()→luceneReturnLuceneDocs()
camel-jgroups-raft
The Exchange header constants in JGroupsRaftConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Routes that reference the constant symbolically (for example setHeader(JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_TIMEOUT, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("JGROUPSRAFT_SET_TIMEOUT", …)) must be updated to use the new value (setHeader("CamelJGroupsRaftSetTimeout", …)).
camel-elasticsearch-rest-client
The Exchange header constants in ElasticSearchRestClientConstant have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Routes that reference the constant symbolically (for example setHeader(ElasticSearchRestClientConstant.SEARCH_QUERY, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("SEARCH_QUERY", …)) must be updated to use the new value (setHeader("CamelElasticsearchSearchQuery", …)).
camel-neo4j
When using the RETRIEVE_NODES or DELETE_NODE operations with the CamelNeo4jMatchProperties header, the property names provided in the JSON match map are now validated before the MATCH / DELETE WHERE clause is built. Property names must be valid identifiers matching [A-Za-z_][A-Za-z0-9_]*. A request whose match map contains a property name that does not match this pattern now fails fast with an IllegalArgumentException (wrapped in a Neo4jOperationException) instead of producing a malformed query. Property values continue to be passed as bound query parameters and are unaffected.
camel-mail
The SMTP producer no longer extracts dynamic JavaMail session properties from message headers by default. Previously any message header whose key started with mail.smtp. (or mail.smtps.) was applied to a per-message JavaMailSender, which meant an upstream producer that mapped untrusted input into the exchange header map (for example platform-http query parameters, JMS or Kafka messages from untrusted producers) could override transport-security settings such as mail.smtp.ssl.trust or mail.smtp.starttls.enable, or redirect the SMTP connection.
This behaviour is now disabled by default. Routes that legitimately rely on per-message mail.smtp. / mail.smtps. headers must opt back in on the endpoint:
.to("smtp://mymailserver:1234?useJavaMailSessionPropertiesFromHeaders=true"); Even with the opt-in, route authors should still strip the namespace with removeHeaders("mail.smtp.", "mail.smtps.") between any untrusted ingress and the mail producer.
In addition, the inbound MailHeaderFilterStrategy now blocks the mail.smtp. / mail.smtps. prefix as well, so an external mail message can no longer inject these into a downstream exchange.
camel-jira - potential breaking change
The Exchange header constants in JiraConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Routes that reference the constants symbolically (for example setHeader(JiraConstants.ISSUE_KEY, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("IssueKey", …)) must be updated to use the new value (setHeader("CamelJiraIssueKey", …)).
As a consequence, the generated Endpoint DSL header accessors on JiraHeaderNameBuilder have been renamed accordingly:
-
issueAssigneeId()→jiraIssueAssigneeId() -
issueAssignee()→jiraIssueAssignee() -
issueComponents()→jiraIssueComponents() -
issueChanged()→jiraIssueChanged() -
issueKey()→jiraIssueKey() -
issuePriorityId()→jiraIssuePriorityId() -
issuePriorityName()→jiraIssuePriorityName() -
projectKey()→jiraIssueProjectKey() -
issueSummary()→jiraIssueSummary() -
issueTransitionId()→jiraIssueTransitionId() -
issueTypeId()→jiraIssueTypeId() -
issueTypeName()→jiraIssueTypeName() -
issueWatchedIssues()→jiraIssueWatchedIssues() -
issueWatchersAdd()→jiraIssueWatchersAdd() -
issueWatchersRemove()→jiraIssueWatchersRemove() -
parentIssueKey()→jiraParentIssueKey() -
childIssueKey()→jiraChildIssueKey() -
linkType()→jiraLinkType() -
minutesSpent()→jiraMinutesSpent()
camel-mongodb-gridfs
The Exchange header values exposed by GridFsConstants have been renamed to follow the standard Camel naming convention, bringing camel-mongodb-gridfs in line with the parent camel-mongodb component (MongoDbConstants.OPERATION_HEADER = "CamelMongoDbOperation"). The Java field names are unchanged, so routes referencing the constants symbolically (e.g. GridFsConstants.GRIDFS_OPERATION, GridFsConstants.GRIDFS_OBJECT_ID) continue to work without modification. However, routes that set or read these headers using the raw string values must be updated:
-
gridfs.operation→CamelGridFsOperation -
gridfs.metadata→CamelGridFsMetadata -
gridfs.chunksize→CamelGridFsChunkSize -
gridfs.objectid→CamelGridFsObjectId -
gridfs.fileid→CamelGridFsFileId
As a consequence, the generated Endpoint DSL header accessors on GridFsHeaderNameBuilder have been renamed accordingly:
-
gridfsOperation()→gridFsOperation() -
gridfsMetadata()→gridFsMetadata() -
gridfsChunksize()→gridFsChunkSize() -
gridfsObjectid()→gridFsObjectId() -
gridfsFileid()→gridFsFileId()
camel-solr
The two Exchange header prefix constants in SolrConstants have been renamed to follow the Camel naming convention already used by the other constants in the same file (which were renamed in 4.10 under CAMEL-21697). The Java field names are unchanged; only the prefix string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
Routes that reference the constants symbolically (for example setHeader(SolrConstants.HEADER_FIELD_PREFIX + "id", …)) continue to work without changes. Routes that set the headers by their literal string value (for example setHeader("SolrField.id", …) or setHeader("SolrParam.commit", …)) must be updated to use the new prefix (CamelSolrField.id, CamelSolrParam.commit).
Because the renamed prefixes now begin with Camel, they are stripped by the standard transport HeaderFilterStrategy (HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire. Routes that bridge an external transport (HTTP, JMS, …) into a solr: producer and want to drive Solr document fields or query parameters from a header supplied by the sender must therefore carry the value in a non-Camel-prefixed application header and map it to the appropriate CamelSolrField. / CamelSolrParam. header in the route between the transport from and the solr: to.
Upgrading from 4.18.0 to 4.18.1
camel-bom
The camel-test module has been removed from camel-bom. This module was included by mistake, as since Camel 4, this is not a JAR but a pom.xml file. Camel end users should use the camel-test-junit5 / camel-test-junit6 JARs and the others directly.
camel-yaml-io / camel-xml-io
In the YAML DSL we have renamed routePolicy to routePolicyRef on the route node, as that is the correct name.
Saga EIP
The Saga EIP has fixed the model for how to configure completion and compensation URIs.
For Java DSL there is no changes, but XML and YAML DSL is affected. Here the <compensation> and <completion> tags has been changed to be an attribute on <saga> instead as shown below:
Before:
<route>
<from uri="direct:start"/>
<saga sagaService="mySagaService">
<compensation uri="mock:compensation"/>
<completion uri="mock:completion"/>
<option key="myOptionKey">
<constant>myOptionValue</constant>
</option>
<option key="myOptionKey2">
<constant>myOptionValue2</constant>
</option>
</saga>
<choice>
<when>
<simple>${body} == 'fail'</simple>
<throwException exceptionType="java.lang.RuntimeException" message="fail"/>
</when>
</choice>
<to uri="mock:end"/>
</route> In YAML DSL the changes are even simpler as the endpoint is moved from uri to the value of completion or compensation.
- route:
from:
uri: direct:start
steps:
- saga:
sagaService: mySagaService
compensation:
uri: mock:compensation
completion:
uri: mock:completion
key: myOptionKey2
- choice:
when:
- expression:
simple:
expression: "${body} == 'fail'"
steps:
- throwException:
message: fail
exceptionType: java.lang.RuntimeException
- to:
uri: mock:end After:
<route>
<from uri="direct:start"/>
<saga sagaService="mySagaService" compensation="mock:compensation" completion="mock:completion">
<option key="myOptionKey">
<constant>myOptionValue</constant>
</option>
<option key="myOptionKey2">
<constant>myOptionValue2</constant>
</option>
</saga>
<choice>
<when>
<simple>${body} == 'fail'</simple>
<throwException exceptionType="java.lang.RuntimeException" message="fail"/>
</when>
</choice>
<to uri="mock:end"/>
</route> - route:
from:
uri: direct:start
steps:
- saga:
sagaService: mySagaService
compensation: mock:compensation
completion: mock:completion
key: myOptionKey2
- choice:
when:
- expression:
simple:
expression: "${body} == 'fail'"
steps:
- throwException:
message: fail
exceptionType: java.lang.RuntimeException
- to:
uri: mock:end camel-simple
In the simple language then init blocks syntax has changed to require that each variable ends with a semicolon and new line (no trailing comments etc is allowed)
For example
- setBody:
simple:
expression: |-
$init{
// this is a java like comment
$sum := ${sum(${header.lines},100)}
$sku := ${iif(${body} contains 'Camel',123,999)}
}init$
orderId=$sku,total=$sum Should be changed to have semicolons as shown below:
- setBody:
simple:
expression: |-
$init{
// this is a java like comment
$sum := ${sum(${header.lines},100)};
$sku := ${iif(${body} contains 'Camel',123,999)};
}init$
orderId=$sku,total=$sum camel-mail
When configured a custom IdempotentRepository on camel-mail endpoint, then Camel will now auto-start the bean which is similar to what camel-file do as well.
camel-json-patch
The camel-json-patch is now deprecated - the library it uses is not active maintained and this module does not work with Jackon 3.
camel-openapi-java
When using code first Rest DSL and have configured base.path then this will now be exclusively used for the returned server url in the API specification.
For example here we set base.path=cheese:
restConfiguration().component("jetty").host("localhost").port(getPort())
.contextPath("myapp")
.apiContextPath("/api-doc")
.apiProperty("cors", "true").apiProperty("base.path", "cheese")
.apiProperty("api.title", "The hello rest thing").apiProperty("api.version", "1.2.3"); Then the generated API specification now returns:
"servers" : [ {
"url" : "http://localhost:58678/cheese"
} ], Previously the context-path would always be used:
"servers" : [ {
"url" : "http://localhost:58678/myapp"
} ], The intention is to allow to configure the base.path as is in the return API specification.
Upgrading Camel 4.17 to 4.18
camel-simple
The simple language has deprecated binary operators that uses space in the name:
-
not containsuse!containsinstead -
not regexuse!regexinstead -
not rangeuse!rangeinstead -
starts withusestartsWithinstead -
ends withuseendsWithinstead
camel-file
The org.apache.camel.component.file.GenericFileOperations has added method storeFileDirectly.
camel-docling
All not working metadata headers have been removed. The option extractAllMetadata has been removed. Using includeRawMetadata will have the same effect given that there is no more customMetadata available.
It corresponds to the removal of functionality no more working since 4.17. Given that this functionality was never available in a LTS version,that the next LST version is the next one and the fix requires important change in upstream dependency; it is not going through a deprecation phase and removed directly.
DoclingDocument return type
The CONVERT_TO_JSON and EXTRACT_STRUCTURED_DATA operations now return a DoclingDocument object (ai.docling.core.DoclingDocument) in the exchange body instead of a raw JSON string. This applies to both docling-serve API mode and CLI mode (where the JSON output is parsed into DoclingDocument via Jackson).
Code that previously received a String and manually deserialized it should be updated:
// Before (4.17)
String result = template.requestBody("direct:convert", filePath, String.class);
DoclingDocument doc = mapper.readValue(result, DoclingDocument.class);
// After (4.18)
DoclingDocument doc = template.requestBody("direct:convert", filePath, DoclingDocument.class); The EXTRACT_METADATA operation also now uses DoclingDocument internally instead of re-parsing a JSON string, though the exchange body type (DocumentMetadata) is unchanged.
EXTRACT_STRUCTURED_DATA differentiation
The EXTRACT_STRUCTURED_DATA operation is now differentiated from CONVERT_TO_JSON when using the docling-serve API. It uses a dedicated request builder that enables table structure recognition (doTableStructure=true) by default. Additional enrichment features (code enrichment, formula enrichment, picture classification) can be enabled via the new configuration properties. Previously, both operations produced identical requests to the server.
The BATCH_EXTRACT_STRUCTURED_DATA operation now has its own dedicated implementation (processBatchStructuredData) that sends structured data requests with table structure recognition enabled, matching its single-document counterpart. Previously, it was handled as a plain batch JSON conversion.
processTimeout and HTTP read timeout
The processTimeout configuration property (default: 30000ms) now also controls the HTTP read timeout when using docling-serve API mode. Previously, the HTTP read timeout was not configurable and used the docling-java client library default. For complex PDF documents that require OCR or enrichment processing, increase processTimeout (e.g., to 120000 for 2 minutes).
OCR bridging to API mode
The enableOCR configuration property is now bridged to the docling-serve API mode when explicitly set to false: it sends doOcr(false) to the server to disable OCR. When left at its default value (true), the server uses its own defaults to preserve backward compatibility. For explicit API-mode OCR control, use the new doOcr property instead.
New advanced configuration properties
18 new configuration properties have been added to expose the full ConvertDocumentOptions from the docling-serve SDK: doOcr, forceOcr, ocrEngine, pdfBackend, tableMode, tableCellMatching, doTableStructure, pipeline, doCodeEnrichment, doFormulaEnrichment, doPictureClassification, doPictureDescription, includeImages, imageExportMode, abortOnError, documentTimeout, imagesScale, and mdPageBreakPlaceholder. All default to null and only take effect when explicitly set. These options are applied to every docling-serve API request via the applyConfigurationToOptions method.
camel-qdrant
The class org.apache.camel.component.qdrant.Qdrant.Headers has been removed. It was deprecated since 4.15. It is replaced by org.apache.camel.component.qdrant.QdrantHeaders.
camel-tahu
The upgrade of Tahu from 1.0.17 to 1.0.18 introduced an API break. HostApplicationEventHandler has been renamed to MultiHostApplicationEventHandler and introduced one more parameter on all methods.
Even if the interface HostApplicationEventHandler is public, I do not expect Camel users to use the implementation TahuHostApplicationEventHandler from Camel. Also the change would be relatively trivial. So replacing it without deprecating it first in order to be able to use the latest Tahu version right away.
Consequently, there is an API break org.apache.camel.tahu.handlers.TahuHostApplicationEventHandler has been removed. It is replaced by org.apache.camel.tahu.handlers.MultiTahuHostApplicationEventHandler.
camel-platform-http-vertx and Rest DSL contract-first
When using Rest DSL in contract first style, then the HTTP engine (vertx-web) instead of a single router to handle all incoming Rest API calls, is now one unique router per API endpoint. This change can affect HTTP request validation as vertx/Quarkus is now also performing this per API endpoint according to the API specification.
All together this would make Camel behave similar for Rest DSL for both code first and contract first style.
camel-nats
The default headerFilterStrategy is now a new NatsHeaderFilterStrategy that filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …). Routes that relied on passing through these header names from NATS messages can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-xmpp
The default headerFilterStrategy is now a new XmppHeaderFilterStrategy that filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …). Routes that relied on passing through these header names from XMPP messages can supply a custom headerFilterStrategy to restore the previous behaviour.
Component deprecation
The camel-olingo2 and camel-olingo4 component are deprecated. This is due the Apache Olingo project is EOL and has been moved to the attic and is no longer maintained.
camel-vertx-websocket
The vertx-websocket consumer now applies a HeaderFilterStrategy to the WebSocket query and path parameters before mapping them into the Camel message headers. The new default VertxWebsocketHeaderFilterStrategy filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-coap, camel-kafka, camel-nats, …). A new headerFilterStrategy endpoint option is available; routes that relied on receiving Camel-prefixed header names from WebSocket query or path parameters can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-atmosphere-websocket
The atmosphere-websocket consumer now applies the endpoint HeaderFilterStrategy to the WebSocket query parameters before mapping them into the Camel message headers. The inherited default HttpHeaderFilterStrategy filters headers starting with Camel / camel (case-insensitive). Routes that relied on receiving Camel-prefixed header names from WebSocket query parameters can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-iggy
The iggy consumer now applies a HeaderFilterStrategy to the Iggy message user-headers before mapping them into the Camel message headers. The new default IggyHeaderFilterStrategy filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog. A new headerFilterStrategy endpoint option is available; routes that relied on receiving Camel-prefixed user-header names from Iggy messages can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-aws2-sqs
Sqs2HeaderFilterStrategy now also configures an inbound filter aligned with the existing outbound regex. Headers starting with Camel / camel (case-insensitive), breadcrumbId and org.apache.camel.* are now filtered in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …). Routes that relied on receiving these header names from inbound SQS messages can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-aws2-sns
Sns2HeaderFilterStrategy now also configures an inbound filter aligned with the existing outbound regex. Headers starting with Camel / camel (case-insensitive), breadcrumbId and org.apache.camel.* are now filtered in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog. Routes that relied on receiving these header names on inbound SNS messages can supply a custom headerFilterStrategy to restore the previous behaviour.
camel-cxf - potential breaking change
The Exchange header constants in CxfConstants (module camel-cxf-common, shared by camel-cxf and camel-cxfrs) have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
Routes that reference the constant symbolically (for example setHeader(CxfConstants.OPERATION_NAME, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("operationName", …)) must be updated to use the new value (setHeader("CamelCxfOperationName", …)).
In particular, the documented cxfrs SimpleConsumer dispatch idiom that routes on the operation name by its literal header name must be updated:
// before
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
.recipientList(simple("direct:${header.operationName}"));
// after
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
.recipientList(simple("direct:${header.CamelCxfOperationName}")); Behaviour change: cross-transport propagation of the operation header
Because the renamed header value now begins with Camel, it is filtered by the standard transport HeaderFilterStrategy (JmsHeaderFilterStrategy, HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire.
Routes that bridge an external transport (JMS, HTTP, …) into a cxf: producer and select the SOAP operation from a header supplied by the sender must therefore carry the operation in a non-Camel-prefixed application header and map it to CxfConstants.OPERATION_NAME (CamelCxfOperationName) in the route between the transport from and the cxf: to:
<!-- before -->
<route>
<from uri="jms:queue:bridge.cxf"/>
<to uri="cxf://bean:serviceEndpoint"/>
</route>
<!-- caller sets the header keyed by the pre-rename value:
setHeader("operationName", "greetMe") -->
<!-- after -->
<route>
<from uri="jms:queue:bridge.cxf"/>
<setHeader name="CamelCxfOperationName">
<simple>${header.operationName}</simple>
</setHeader>
<to uri="cxf://bean:serviceEndpoint"/>
</route>
<!-- caller sets a non-Camel-prefixed application carrier header (any name
that is not stripped by the transport HeaderFilterStrategy works);
the route restores the CXF operation header after the transport hop. --> The same pattern applies to HTTP-based bridges (platform-http/jetty/netty -http/http → cxf:) and any other transport whose default HeaderFilterStrategy filters Camel* headers.
camel-dns - potential breaking change
The Exchange header constants in DnsConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:
| Constant | Previous value | New value |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Routes that reference the constant symbolically (for example setHeader(DnsConstants.DNS_SERVER, …)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("dns.server", …) or setHeader("term", …)) must be updated to use the new value:
// before
from("direct:start")
.setHeader("dns.name", constant("www.example.com"))
.setHeader("dns.type", constant("A"))
.to("dns:lookup");
// after
from("direct:start")
.setHeader("CamelDnsName", constant("www.example.com"))
.setHeader("CamelDnsType", constant("A"))
.to("dns:lookup"); Behaviour change: cross-transport propagation of dns.* headers
Because the renamed header values now begin with Camel, they are filtered by the standard transport HeaderFilterStrategy (JmsHeaderFilterStrategy, HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire.
Routes that bridge an external transport (HTTP, JMS, …) into a dns: producer and let the sender choose the DNS operation parameters via headers must therefore carry those parameters in non-Camel-prefixed application headers and map them to the corresponding DnsConstants value in the route between the transport from and the dns: to. Allowing untrusted senders to drive DnsConstants.DNS_SERVER (the recursive resolver target in dns:dig) without such a mapping step is not the intended use of the component.