[ 
https://issues.apache.org/jira/browse/CAMEL-25721?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen updated CAMEL-25721:
--------------------------------
    Fix Version/s: 4.24.0

> Route dumps (XML, YAML, Java) leave out an option set to its documented 
> default, so a verb bindingMode off, an onException redeliveryDelay or a 
> circuit breaker timeoutEnabled false take the parent value once the dump is 
> loaded
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-25721
>                 URL: https://issues.apache.org/jira/browse/CAMEL-25721
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-core
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> The model writers behind the route dumps ({{LwModelToXMLDumper}}, 
> {{LwModelToYAMLDumper}}, {{LwModelToJavaDumper}}; used by {{camel transform 
> route}}, {{camel validate normalize}}, {{camel.main.dumpRoutes}} and the 
> developer console) skip an attribute whose value equals the {{defaultValue}} 
> of its {{@Metadata}}: the generated calls are 
> {{doWriteAttribute("bindingMode", def.getBindingMode(), "off")}}, and the 
> base method writes nothing when the value equals the default (main 
> 9fb9bc911f78: {{YamlModelWriterSupport}} line 61, {{ModelWriter}} line 4025, 
> {{JavaDslModelWriterSupport}} line 604).
> That is only safe when "not set" means "the default". For many options it 
> does not: an option that is not set takes the value of a parent level. When a 
> route sets such an option to the documented default on purpose, the dump 
> drops it, and the dumped route, once loaded, runs with the parent's value. 
> Nothing is logged. Examples, each run on main (loaded from YAML, dumped as 
> YAML and as XML, loaded again):
> * *rest / verb*: {{bindingMode}}, {{skipBindingOnErrorCode}}, 
> {{clientRequestValidation}}, {{clientResponseValidation}}, {{enableCORS}}, 
> {{enableNoContentResponse}} not set take the value of the rest, then of the 
> rest configuration ({{RestDefinition}} lines 1133-1201, 
> {{RestBindingReifier}} lines 47-75). A verb with {{bindingMode: "off"}} under 
> {{camel.rest.bindingMode=json}} replies {{{"format":"raw"}}} instead of the 
> body as it is; a verb with {{clientRequestValidation: false}} under a rest 
> configuration that validates answers 415 instead of 200.
> * {{skipBindingOnErrorCode}} is documented with default {{false}}, but 
> {{RestConfiguration}} (camel-api line 84) defaults to {{true}}: a verb with 
> {{skipBindingOnErrorCode: false}} and the default rest configuration binds 
> its error replies to JSON; after the dump they are no longer bound 
> ({{{error=bad request}}} instead of {{{"error":"bad request"}}}).
> * *redelivery policy of an onException*: 
> {{ExceptionPolicy.createRedeliveryPolicy}} copies the error handler's policy 
> and overrides only the options that are set. An {{onException}} with 
> {{redeliveryDelay: 1000}} under an error handler with {{redeliveryDelay: 
> 30000}} redelivers after 1 s; after the dump after 30 s. The same for 
> {{logStackTrace}}, {{logExhausted}}, {{retryAttemptedLogLevel}}, 
> {{backOffMultiplier}}, {{maximumRedeliveryDelay}}, 
> {{allowRedeliveryWhileStopping}} and the others that have a default.
> * *circuit breaker*: {{ResilienceReifier.buildResilience4jConfiguration}} 
> layers the global configuration ({{camel.resilience4j.*}}), the referenced 
> one and the local one. A {{resilience4jConfiguration}} with {{timeoutEnabled: 
> false}} under a global {{timeoutEnabled=true}} runs without a timeout; after 
> the dump the call times out and goes to the fallback. The same for the other 
> options with a default and for {{faultToleranceConfiguration}}.
> * *route*: {{shutdownRoute: Default}} / {{shutdownRunningTask: 
> CompleteCurrentTaskOnly}} not set take the CamelContext's value 
> ({{DefaultRoute}} lines 611-631).
> {{camel validate normalize}} is recommended by the YAML compact-notation 
> warning and users copy its output over their files (CAMEL-25490); {{camel 
> transform route}} turns Java and XML routes into YAML (CAMEL-25202). In both 
> cases the routes the user gets back run differently. The JAXB dumper 
> (camel-xml-jaxb) writes every attribute that is set.
> Trigger: default options; any of the options above set explicitly to its 
> documented default, in a context where the parent level has another value 
> (and for {{skipBindingOnErrorCode: false}} even with the default rest 
> configuration).
> h3. Reproduction
> New tests (dump the loaded routes and run both):
> * {{YamlDumpExplicitDefaultValuesTest}} (camel-yaml-dsl, 3 tests): on main 
> {{expected: "\{format=raw\}" but was: "\{"format":"raw"\}"}}, {{expected: 
> "\{"error":"bad request"\}" but was: "\{error=bad request\}"}}, {{expected: 
> "handled" but was: "not redelivered within 10 seconds"}}.
> * {{XmlDumpExplicitDefaultValuesTest}} (camel-xml-io-dsl, 2 tests): 
> {{expected: <200 stored> but was: <415 null>}}, {{expected: <handled> but 
> was: <not redelivered within 10 seconds>}}.
> * {{LwModelToJavaDumperTest.testDumpOptionsSetToTheirDefaultValue}} 
> (camel-java-io): {{.bindingMode("off")}} and {{.redeliveryDelay("1000")}} 
> missing from the Java dump.
> h3. Proposed fix
> The writer each dumper creates writes these options whenever they are set: 
> the six rest binding options and the route {{shutdownRoute}} / 
> {{shutdownRunningTask}} by name, and every option of a redelivery policy, a 
> {{resilience4jConfiguration}} and a {{faultToleranceConfiguration}} (while 
> that element is written). Other options keep being left out at their default, 
> so dumps of Java routes do not fill up with values the model or the Java DSL 
> set by default (writing every set option was tried first: the Java DSL sets 
> {{pretty="false"}} on every {{simple}}, a {{json}} data format its 
> {{library}}, and the camel-java-io round-trip tests showed it). The generated 
> writers and their templates are not changed. Note in the 4.24 upgrade guide.
> Not changed: the documented default of {{skipBindingOnErrorCode}} ({{false}}) 
> does not match the runtime default ({{true}}); worth its own docs fix.
> Affected: main (tested); camel-4.23.x and camel-4.22.x have the same writers 
> (read, not run); camel-4.18.x XML dump the same (read), its YAML writer 
> differs (not checked).
> Duplicate check (2026-10-17): JIRA text "dump default value", "dumper 
> default", "route dump bindingMode", "YAML dump redeliveryDelay", "ModelWriter 
> default", "skipBindingOnErrorCode default", "dump errorHandler": only 
> CAMEL-25651 / CAMEL-25493 (top-level errorHandler and intercepts dropped, a 
> different cause), CAMEL-25079 / CAMEL-25255 (other dumper gaps, resolved). 
> GitHub pull requests "dump default value", "LwModelToYAMLDumper 
> doWriteAttribute", "CAMEL-25651": none about this.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to