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());
