Claus Ibsen created CAMEL-24704:
-----------------------------------

             Summary: camel-yaml-dsl - accept beans (and other name-keyed 
lists) written as a map keyed by name
                 Key: CAMEL-24704
                 URL: https://issues.apache.org/jira/browse/CAMEL-24704
             Project: Camel
          Issue Type: Improvement
          Components: camel-yaml-dsl
            Reporter: Claus Ibsen


In the YAML DSL beans are a list of items with a name property:

{code}
- beans:
    - name: myProcessor
      type: "#class:com.example.MyProcessor"
{code}

Every other configuration format keys a bean by its name, and that is what both 
people and AI models write first (seen in 3 of the 6 benchmark runs on 
2026-09-12, every time as one of these two shapes):

{code}
- beans:
    myProcessor:
      type: "#class:com.example.MyProcessor"
{code}
{code}
- beans:
    - myProcessor:
        type: "#class:com.example.MyProcessor"
{code}

Both are rejected ("object found, array expected", "required property 'name' 
not found"). Since a bean name is unique in the file, the map form is 
unambiguous, and YAML maps keep their order, so nothing is lost. Proposal: 
accept the map form as an alternative, keep the list as the canonical form (the 
normalizer and the canonical validator keep producing and requiring the list), 
and document only one of them as primary.

Where: BeansDeserializer (hand written, camel-yaml-dsl-deserializers) reads a 
MappingNode as name -> bean; GenerateYamlSchemaMojo emits beans as oneOf [the 
current array, an object with additionalProperties: the bean definition]; the 
YAML DSL validator and the TUI/MCP validation follow the schema; Kaoto and 
other consumers of the schema need to read both forms.

Other lists in the schema whose items are identified by a required name, found 
by walking camelYamlDsl.json, where the same map form would be as natural:

|| property || item type || used by || map form ||
| beans | BeanFactoryDefinition | root, routeTemplate, templatedRoute | beans: 
{myBean: {type: ...}} |
| parameters | RouteTemplateParameterDefinition / 
TemplatedRouteParameterDefinition | routeTemplate, templatedRoute | parameters: 
{name: {defaultValue: ...}} or name: default |
| headers | SetHeaderDefinition | setHeaders | headers: {foo: {constant: x}} |
| variables | SetVariableDefinition | setVariables | variables: {foo: {simple: 
...}} |
| param | ParamDefinition | rest get/post/put/delete/patch/head | param: {id: 
{type: path, ...}} |
| header | ResponseHeaderDefinition | rest responseMessage | header: {name: 
{...}} |
| univocityHeader | UniVocityHeader | univocity data formats | (rare) |

Lists whose items only have an optional id (rest, get/post, when, doCatch) have 
no natural key and should stay lists.

Suggested order: beans first (the case that fails in practice), then 
setHeaders/setVariables and the template parameters, which a model also tends 
to write as maps. Each needs the deserializer, the schema, a validator test and 
a doc line. Found while benchmarking a local model against the YAML DSL; the 
validator on CAMEL-24698 meanwhile tells the user how to rewrite the map form 
as the list.



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

Reply via email to