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

davsclaus 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 ffc7fc913cbf docs: upgrade notes for the camel-spring-boot 4.23 
starter changes
ffc7fc913cbf is described below

commit ffc7fc913cbf42031c95217e457b361e5d5c4ad4
Author: Federico Mariani <[email protected]>
AuthorDate: Thu Sep 3 07:19:46 2026 +0200

    docs: upgrade notes for the camel-spring-boot 4.23 starter changes
    
    Adds the 4.23 upgrade guide entries for the camel-spring-boot starter
    changes landing under CAMEL-24498, CAMEL-24500, CAMEL-24501, CAMEL-24505,
    CAMEL-24506, CAMEL-24577, CAMEL-24592 and CAMEL-24593, next to the
    camel-spring-boot entries already present for the release. Documentation
    only.
    
    Closes #26043
    
    Co-authored-by: Federico Mariani <[email protected]>
    Co-Authored-By: Claude Opus 5 <[email protected]>
    Co-Authored-By: Claude Fable 5.1 <[email protected]>
---
 .../ROOT/pages/camel-4x-upgrade-guide-4_23.adoc    | 272 +++++++++++++++++++++
 1 file changed, 272 insertions(+)

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 788cc39b2ae9..df7de54e3453 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
@@ -1276,6 +1276,278 @@ unaffected.
 
 `String` to `java.io.File` is unchanged: there the `String` genuinely is a 
path.
 
+==== camel-observability-services-starter narrows its injected defaults
+
+The starter contributes a set of management defaults as soon as it is on the 
classpath. Three of them were
+wider than the Spring Boot or Camel setting they replaced, and have been 
brought back in line.
+
+The management listener now binds to loopback. `management.server.port` was 
injected without a matching
+`management.server.address`, so adding the starter opened a second listener on 
every interface. Spring Boot
+ships no separate management listener at all, so that listener and its reach 
are now both a deliberate choice.
+
+Deployments whose kubelet probes or Prometheus scrapers reach the pod over the 
network — which is every
+Kubernetes deployment using the health and metrics endpoints — must widen the 
bind address explicitly:
+
+[source,properties]
+----
+management.server.address = 0.0.0.0
+----
+
+Doing so should be paired with a `NetworkPolicy` or with authentication in 
front of the management port.
+
+`management.endpoint.health.show-details` is now `when-authorized` instead of 
`always`, so the aggregate
+`/observe/health` endpoint shows its individual indicators to an authenticated 
caller and a bare status to
+everybody else. Camel health checks report on the resources a route talks to, 
and their detail can identify
+those resources. With no Spring Security on the classpath the endpoint behaves 
as `never`. To restore the
+previous behaviour:
+
+[source,properties]
+----
+management.endpoint.health.show-details = always
+----
+
+The `live` and `ready` health groups keep `show-details=always`. The kubelet 
reads them unauthenticated and
+puts the response body into the probe-failure event, so `kubectl describe pod` 
still names the indicator that
+took the pod down, and those groups hold availability-state indicators that 
report a status and carry no data.
+
+`camel.health.exposure-level` is no longer forced to `full` and now follows 
the Camel default of `default`,
+which filters health check metadata — endpoint URIs, route and consumer 
identifiers — out of the health
+response while keeping the check names, error messages and stack traces. To 
opt back in:
+
+[source,properties]
+----
+camel.health.exposure-level = full
+----
+
+The defaults are still registered as the lowest precedence property source, so 
all three settings are
+overridden by ordinary application configuration. The full injected set is 
documented in the
+https://camel.apache.org/camel-spring-boot/next/starters/observability-services.html[starter
 documentation].
+
+
+==== camel-debug-starter no longer opens a JMX connector by default
+
+`camel.debug.jmx-connector-enabled` now defaults to `false` instead of `true`. 
Adding
+`camel-debug-starter` to the classpath still installs and enables the 
`BacklogDebugger`, which is what
+the starter is for, but it no longer creates an RMI registry and JMX RMI 
server on
+`camel.debug.jmx-connector-port` (`1099`). Nothing listens until the connector 
is asked for.
+
+Unlike camel-main, where `camel.debug.enabled` defaults to `false` and so the 
connector is only reached
+after the debugger is explicitly turned on, the starter enables the debugger 
as soon as it is on the
+classpath. That made the dependency alone enough to open a port, and the 
connector is created without
+authentication or transport security: anyone able to reach it can suspend 
routes and read message
+payloads.
+
+Tooling that attaches to the debugger from another process — the IntelliJ IDEA 
and VS Code Camel
+plugins — needs the connector, and must now request it:
+
+[source,properties]
+----
+camel.debug.jmx-connector-enabled = true
+camel.debug.jmx-connector-port = 1099
+----
+
+Enable it only on a trusted network, with the port bound to a loopback 
interface or protected by a
+firewall.
+
+The `camel debug` command of Camel JBang is unaffected: it drives a Spring 
Boot application through the
+local CLI connector from `camel-cli-connector-starter`, not through JMX.
+
+
+==== camel-spring-boot health check stack traces moved to the full exposure 
level
+
+The Camel health indicator added the full stack trace of a failed health check 
as `error.stacktrace` to the
+per-check data in `/actuator/health` at every exposure level except `oneline`. 
A DOWN check whose result
+carries an exception — a consumer that lost its broker, a pool that cannot 
connect — therefore serialised the
+whole cause chain into the actuator response at the default exposure level.
+
+`error.stacktrace` is now emitted only when the exposure level is `full`. 
`error.message` is still reported at
+the `default` level, which mirrors what Spring Boot's own health indicators 
expose; camel-main's management
+endpoint is stricter still and includes `error-stacktrace` only when the 
caller asks for it with
+`?stackTrace=true`. `camel-microprofile-health`, through which Camel Quarkus 
builds its health responses, applies
+the same gating from this release so the runtimes stay aligned. It also 
matches the documented meaning of the
+levels, where `full` is the level that includes all details from the invoked 
health checks. The trace is
+unchanged in the application log.
+
+A deployment that consumed the trace from the actuator response can opt back 
in with:
+
+[source,properties]
+----
+camel.health.exposure-level = full
+----
+
+Note that `full` also stops filtering the health check metadata out of the 
per-check data, so the output is
+more verbose than the previous default in other respects too.
+
+
+==== camel-platform-http-starter deletes multipart uploads when the exchange 
completes
+
+Multipart file uploads are copied out of the servlet container into the 
servlet temporary directory so that they
+remain readable after the HTTP request has completed. These temporary copies 
were never removed and accumulated for
+the lifetime of the application. They are now deleted when the exchange is 
done being routed, that is after the
+response has been written, which aligns the starter with the 
`deleteUploadedFilesOnEnd` option of
+`camel-platform-http-vertx` and with `camel-http-common`, where the container 
deletes its own part files.
+
+Routes that consume the upload while the exchange is being routed (saving it 
with the file producer, streaming it to
+a remote system, unmarshalling it) are unaffected. A route that stores the 
temporary path and reads the file after
+the exchange has completed must opt out and delete the file itself:
+
+[source,properties]
+----
+camel.component.platform-http.server.delete-uploaded-files-on-end=false
+----
+
+
+==== camel-platform-http-starter path variables follow the matched path
+
+Path variable headers are now taken from the path Spring matched the request 
against, instead of from
+the undecoded request URI. The values are therefore percent-decoded and carry 
no matrix parameters,
+which is what the vertx engine has always provided.
+
+For a consumer such as `platform-http:/greeting/{name}`:
+
+[cols="1,1,1"]
+|===
+|Request |Header `name` before |Header `name` now
+
+|`/greeting/%61dmin`
+|`%61dmin`
+|`admin`
+
+|`/greeting/John%20Doe`
+|`John%20Doe`
+|`John Doe`
+
+|`/greeting/name;v=1`
+|`name;v=1`
+|`name`
+|===
+
+An application that decoded the header itself, or that parsed matrix 
parameters out of it, must drop
+that handling. Requests whose path variables contain no percent-encoding and 
no matrix parameters are
+unaffected.
+
+`CamelHttpPath` (`Exchange.HTTP_PATH`) is unchanged: it still reports the raw 
request path with the
+servlet context-path removed.
+
+
+==== camel-micrometer-starter bounds the uri tag
+
+The starter contributes the `uri` low cardinality tag of the 
`http.server.requests` metrics when
+`camel.metrics.uri-tag-enabled = true`. Two things change in this release.
+
+First, the property is now matched in its documented kebab-case form. The 
auto-configuration was conditional on
+`camel.metrics.uriTagEnabled`, a spelling that Spring Boot cannot resolve from 
a relaxed binding source, so an
+application that configured `camel.metrics.uri-tag-enabled = true`, the name 
listed in the starter
+documentation, never got the Camel uri tag at all. Both spellings now enable 
it. An application that had the
+kebab-case property set therefore starts seeing Camel consumer paths in the 
`uri` tag where it previously saw
+the value computed by Spring.
+
+Second, when a request does not resolve to a Camel HTTP consumer — a 404, or 
any request served by something
+else than the Camel servlet — the tag was the requested path (servlet path 
plus path info) verbatim. Micrometer
+registers a meter per distinct tag value and keeps it for the lifetime of the 
process, so the number of meters
+followed the number of distinct paths that had been requested, instead of the 
number of routes. Such requests
+now keep the `uri` value computed by Spring's own 
`DefaultServerRequestObservationConvention`: the mapped
+pattern for a Spring MVC endpoint, and a constant such as `UNKNOWN`, 
`NOT_FOUND` or `REDIRECTION` otherwise.
+This is what `camel.metrics.uri-tag-enabled` already documents ("will be 
marked as UNKNOWN"). Requests that do
+resolve to a Camel consumer are unchanged, the tag is the static consumer 
path, such as `/users/{id}`.
+
+With `camel.metrics.uri-tag-dynamic = true` the requested path is still used, 
such as `/camel/users/123`, but
+only for requests that resolve to a Camel consumer, and the tag value is now 
capped at 200 characters.
+
+Dashboards and alerts that matched on the raw path of requests that are not 
served by Camel must use the Spring
+value instead, for example the mapped pattern `/actuator/health` of a Spring 
MVC endpoint.
+
+
+==== camel-jasypt-starter defaults to PBEWITHHMACSHA256ANDAES_256
+
+`camel.component.jasypt.algorithm` now defaults to 
`PBEWITHHMACSHA256ANDAES_256` instead of `PBEWithMD5AndDES`.
+The starter already recognises that algorithm as one that requires an 
initialization vector, so
+`org.jasypt.iv.RandomIvGenerator` is installed automatically when 
`camel.component.jasypt.iv-generator-class-name`
+is not set.
+
+This is a breaking change for existing encrypted values: a value produced 
under `PBEWithMD5AndDES` cannot be
+decrypted with the new default, and startup fails with an 
`EncryptionOperationNotPossibleException` when the
+property is resolved. Either re-encrypt the values with the new algorithm, or 
pin the previous default:
+
+[source,properties]
+----
+camel.component.jasypt.algorithm = PBEWithMD5AndDES
+----
+
+Whichever Jasypt tooling is used to produce the ciphertext must be given the 
same algorithm *and* a random IV
+generator — the Jasypt CLI defaults to no IV generator, and a value encrypted 
without one cannot be decrypted by
+the starter:
+
+[source,bash]
+----
+jbang org.apache.camel:camel-jasypt:<camel-version> \
+  -c encrypt -p "$JASYPT_PASSWORD" -i my-secret-value \
+  -a PBEWITHHMACSHA256ANDAES_256 -riga SHA1PRNG
+----
+
+The `camel-jasypt` component itself is unchanged: `JasyptPropertiesParser` 
leaves the algorithm unset, so it still
+falls back to the Jasypt library default of `PBEWithMD5AndDES`. Aligning the 
component with the starter is a
+separate change; until it lands, an application that configures 
`JasyptPropertiesParser` directly keeps the old
+algorithm unless it sets one.
+
+The starter's usage documentation no longer shows the master password next to 
the encrypted value it protects. Use
+the `sysenv:` or `sys:` prefixes of `camel.component.jasypt.password` to read 
it from the environment or a JVM
+system property, or inject it from an external secret store.
+
+
+==== Starter configuration options that cannot be bound are reported
+
+The starters bind `camel.component.*`, `camel.dataformat.*` and 
`camel.language.*` onto the Camel component,
+data format or language they configure. Two steps of that binding used to 
discard a configured value without
+reporting it, so a mistyped or unbindable option left the target at its 
default and nothing appeared in the
+log. Both now report the value they cannot use, which matches what 
`camel.rest.*` has always done.
+
+An option of a complex (object) type is configured with a reference to a bean, 
such as:
+
+[source,properties]
+----
+camel.component.http.ssl-context-parameters = #bean:mySslContextParameters
+----
+
+The generated converter used to return `null` for any value that did not start 
with `#`, and for a value
+naming a bean that does not exist. A typo in the bean id therefore produced a 
component with the option
+unset. Such a value now aborts startup with a message naming the value, the 
target type and the
+configuration prefix it was set under. A plain bean id with no `#` prefix — 
`mySslContextParameters` — is
+resolved rather than discarded, as are `#autowired` and `#type:com.foo.MyType`.
+
+These converters are registered with `@ConfigurationPropertiesBinding` and 
therefore take part in every
+`@ConfigurationProperties` binding in the application, not only in Camel's 
own. A binding whose target class
+is neither under `org.apache.camel` nor annotated with 
`@ConfigurationProperties` for a `camel.` prefix keeps
+the previous behaviour, so adding a starter to the classpath cannot make an 
unrelated application property
+fail to bind.
+
+The generated customizers copied the whole configuration onto the target with 
`failIfNotSet=false`, so an
+option with no matching setter on the target was dropped without a log line. 
An option that the application
+configured itself and that cannot be set now aborts startup. An option that 
only carries the default the
+generator took from the Camel catalog is logged at `DEBUG` and ignored, since 
the target keeps its own
+default and there is nothing to fix in the application. The options belonging 
to the auto-configuration
+layer itself — `enabled` and `customizer` — are removed before the copy, as 
they were never options on the
+Camel target.
+
+An application that set an option which never took effect will therefore now 
fail to start. The remedy is
+to correct or remove the reported option. To restore the previous tolerance 
while doing so:
+
+[source,properties]
+----
+camel.springboot.lenient-configuration-binding = true
+----
+
+Such an option is then logged at `WARN` with its name, instead of being 
dropped silently as before.
+
+This affects hand-written code as well. 
`CamelPropertiesHelper.setCamelProperties(context, target, properties,
+false)`, and `CamelPropertiesHelper.copyProperties` which calls it, are public 
API used by hand-written
+customizers and auto-configuration outside the generated starters. They keep 
ignoring an option that cannot
+be set — that behaviour is unchanged — but each such option is now logged at 
`WARN` naming the option and the
+target class, where previously nothing was logged at all. Applications with 
hand-written customizers may
+therefore see new `WARN` lines at startup for options that have never been 
applied. The generated starters no
+longer use that path; they call 
`CamelPropertiesHelper.copyConfigurationProperties` instead.
+
+
 === camel-azure-storage-blob and camel-azure-storage-datalake
 
 Local downloads configured with `fileDir` now resolve existing filesystem path 
segments before checking

Reply via email to