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-spring-boot.git

commit 5b1f42a3e11d7104c4adeaee89f8541c72335899
Author: croway <[email protected]>
AuthorDate: Fri Jul 10 18:16:35 2026 +0200

    CAMEL-24000: camel-spring-boot - do not mutate shared 
@ConfigurationProperties beans
    
    The trace, error registry and security policy auto-configurations applied
    dev/prod profile defaults by mutating the injected @ConfigurationProperties
    singleton, so any other bean reading the same properties observed the
    mutated values instead of what the user configured. Compute the effective
    values locally instead.
    
    Co-Authored-By: Claude Fable 5 <[email protected]>
---
 .../CamelErrorRegistryAutoConfiguration.java       |  8 ++++----
 .../CamelSecurityPolicyAutoConfiguration.java      | 23 ++++++++++++----------
 .../boot/trace/CamelTraceAutoConfiguration.java    | 12 +++++------
 3 files changed, 23 insertions(+), 20 deletions(-)

diff --git 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java
 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java
index 401ca4d9690..7cd3267a287 100644
--- 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java
+++ 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/errorregistry/CamelErrorRegistryAutoConfiguration.java
@@ -34,10 +34,10 @@ public class CamelErrorRegistryAutoConfiguration {
     @Bean
     public ErrorRegistry errorRegistry(CamelContext camelContext, 
CamelErrorRegistryConfigurationProperties config) {
         // dev profile enables error registry to capture routing errors for 
tooling (TUI)
-        if (!config.isEnabled() && 
"dev".equals(camelContext.getCamelContextExtension().getProfile())) {
-            config.setEnabled(true);
-        }
-        if (!config.isEnabled()) {
+        // (do not mutate the shared configuration properties bean)
+        boolean enabled = config.isEnabled()
+                || 
"dev".equals(camelContext.getCamelContextExtension().getProfile());
+        if (!enabled) {
             return null;
         }
 
diff --git 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java
 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java
index 909287d45c7..5fc7414c187 100644
--- 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java
+++ 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/security/CamelSecurityPolicyAutoConfiguration.java
@@ -51,14 +51,17 @@ public class CamelSecurityPolicyAutoConfiguration {
             CamelSecurityPolicyConfigurationProperties config, Environment 
environment) {
 
         // apply profile-based security defaults
+        // (do not mutate the shared configuration properties bean)
         String profile = camelContext.getCamelContextExtension().getProfile();
-        if ("dev".equals(profile) && config.getInsecureDevPolicy() == null) {
-            config.setInsecureDevPolicy("allow");
-        } else if ("prod".equals(profile) && 
"warn".equals(config.getPolicy())) {
-            config.setPolicy("fail");
+        String policy = config.getPolicy();
+        String insecureDevPolicy = config.getInsecureDevPolicy();
+        if ("dev".equals(profile) && insecureDevPolicy == null) {
+            insecureDevPolicy = "allow";
+        } else if ("prod".equals(profile) && "warn".equals(policy)) {
+            policy = "fail";
         }
 
-        SecurityConfigurationProperties securityConfig = 
applySecurityProperties(camelContext, config);
+        SecurityConfigurationProperties securityConfig = 
applySecurityProperties(config, policy, insecureDevPolicy);
 
         Map<String, Object> camelProperties = 
extractCamelProperties(environment);
 
@@ -74,14 +77,14 @@ public class CamelSecurityPolicyAutoConfiguration {
         return result;
     }
 
-    private SecurityConfigurationProperties 
applySecurityProperties(CamelContext camelContext,
-            CamelSecurityPolicyConfigurationProperties config) {
+    private SecurityConfigurationProperties 
applySecurityProperties(CamelSecurityPolicyConfigurationProperties config,
+            String policy, String insecureDevPolicy) {
 
         // get the security config from camel-main's 
MainConfigurationProperties
         // which is already bound by CamelAutoConfiguration via 
CamelConfigurationProperties
         SecurityConfigurationProperties securityConfig = new 
SecurityConfigurationProperties(null);
 
-        securityConfig.setPolicy(config.getPolicy());
+        securityConfig.setPolicy(policy);
         if (config.getSecretPolicy() != null) {
             securityConfig.setSecretPolicy(config.getSecretPolicy());
         }
@@ -91,8 +94,8 @@ public class CamelSecurityPolicyAutoConfiguration {
         if (config.getInsecureSerializationPolicy() != null) {
             
securityConfig.setInsecureSerializationPolicy(config.getInsecureSerializationPolicy());
         }
-        if (config.getInsecureDevPolicy() != null) {
-            securityConfig.setInsecureDevPolicy(config.getInsecureDevPolicy());
+        if (insecureDevPolicy != null) {
+            securityConfig.setInsecureDevPolicy(insecureDevPolicy);
         }
         if (config.getAllowedProperties() != null) {
             securityConfig.setAllowedProperties(config.getAllowedProperties());
diff --git 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java
 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java
index 9c03a19d5ba..c3f3c1ac6c9 100644
--- 
a/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java
+++ 
b/core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/trace/CamelTraceAutoConfiguration.java
@@ -33,10 +33,10 @@ public class CamelTraceAutoConfiguration {
     public BacklogTracer backlogTracer(CamelContext camelContext, 
CamelTraceConfigurationProperties config)
             throws Exception {
         // dev profile enables tracer standby so tooling (TUI) can activate 
tracing on demand
-        if (!config.isStandby() && 
"dev".equals(camelContext.getCamelContextExtension().getProfile())) {
-            config.setStandby(true);
-        }
-        if (!config.isEnabled() && !config.isStandby()) {
+        // (do not mutate the shared configuration properties bean)
+        boolean standby = config.isStandby()
+                || 
"dev".equals(camelContext.getCamelContextExtension().getProfile());
+        if (!config.isEnabled() && !standby) {
             return null;
         }
 
@@ -45,12 +45,12 @@ public class CamelTraceAutoConfiguration {
 
         // enable tracer on camel
         camelContext.setBacklogTracing(config.isEnabled());
-        camelContext.setBacklogTracingStandby(config.isStandby());
+        camelContext.setBacklogTracingStandby(standby);
         camelContext.setBacklogTracingTemplates(config.isTraceTemplates());
 
         BacklogTracer tracer = 
org.apache.camel.impl.debugger.BacklogTracer.createTracer(camelContext);
         tracer.setEnabled(config.isEnabled());
-        tracer.setStandby(config.isStandby());
+        tracer.setStandby(standby);
         tracer.setBacklogSize(config.getBacklogSize());
         tracer.setRemoveOnDump(config.isRemoveOnDump());
         tracer.setBodyMaxChars(config.getBodyMaxChars());

Reply via email to