[ https://issues.apache.org/jira/browse/CAMEL-10542?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15711779#comment-15711779 ]
Claus Ibsen commented on CAMEL-10542: ------------------------------------- You could argue that <marshal><csv> ... should use its own instance as there is no reference to a named data format, where as using <marshal ref="csv-dataformat"> then you are using that shared your add to the registry. So its maybe more in how <marshal><csv> creates the dataformat that needs to be looked at / fixed. > DataFormat from registry is used for every dataformat operation > (marshal/unmarshal) > ----------------------------------------------------------------------------------- > > Key: CAMEL-10542 > URL: https://issues.apache.org/jira/browse/CAMEL-10542 > Project: Camel > Issue Type: Bug > Components: camel-core > Reporter: Luca Burgazzoli > Assignee: Luca Burgazzoli > Fix For: 2.18.2, 2.19.0 > > > While working on an issue related to spring-boot I found out that if a data > format is registered in camel registry with the same name as the one camel > looks-up with the help of DefaultDataFormatResolver, this object is then > re-configured for each data format definition so one definition may override > previous configuration with an undefined behavior. > So assume you have an xml route definitions as: > {code:xml} > <routes xmlns="http://camel.apache.org/schema/spring"> > <route> > <from uri="direct:unmarshal"/> > <unmarshal> > <csv delimiter=";" headerDisabled="true"/> > </unmarshal> > </route> > <route> > <from uri="direct:marshal"/> > <marshal> > <csv headerDisabled="true" quoteDisabled="true"/> > </marshal> > </route> > </routes> > {code} > And some code like: > {code:java} > InputStream is = getClass().getResourceAsStream("..."); > SimpleRegistry reg = new SimpleRegistry(); > reg.put("csv-dataformat", new CsvDataFormat()); > DefaultCamelContext ctx = new DefaultCamelContext(reg); > ctx.addRouteDefinitions(ctx.loadRoutesDefinition(is).getRoutes()); > ctx.start(); > ProducerTemplate template = ctx.createProducerTemplate(); > String result = template.requestBody( > "direct:marshal", > Arrays.asList(Arrays.asList( "A1", "B1", "C1" )), > String.class); > assertEquals("A1,B1,C1", result); > ctx.stop > {code} > Then this test fails with: > {code} > Expected :A1,B1,C1 > Actual :A1;B1;C1 > {code} > It fails because the object added to the SimpleRegistry is shared among the > two csv dataformats so it is configured to have delimiter = ';' > For spring-boot this causes some issues as it registers data formats beans as > part of its auto-configuration magic thus if you do not set your own instance > of data format, any data format operation like marshal/unmarshal may not work > as expected. > - for spring-boot a solution would be to annotate auto configured data format > beans with prototype scope. > - a more generic solution would be to make DataFormat Cloneable and clone the > bean found in the registry -- This message was sent by Atlassian JIRA (v6.3.4#6332)