[ https://issues.apache.org/jira/browse/CAMEL-7390?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13978440#comment-13978440 ]
Nathan Jensen commented on CAMEL-7390: -------------------------------------- This is related to this spring feature: https://jira.spring.io/browse/SPR-4374 > CamelNamespaceHandler issue when using Spring's > AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverriding(false) > ----------------------------------------------------------------------------------------------------------------------------- > > Key: CAMEL-7390 > URL: https://issues.apache.org/jira/browse/CAMEL-7390 > Project: Camel > Issue Type: Bug > Components: camel-spring > Affects Versions: 2.11.2 > Reporter: Nathan Jensen > Priority: Minor > > Some of the Spring ApplicationContext implementations (i.e. > AbstractRefreshableApplicationContext) allow you to call > setAllowBeanDefinitionOverriding(false) to enforce that beans initialized by > spring do not reuse ids. This can be especially helpful in a pluggable > application where different developers may contribute different spring files. > CamelNamespaceHandler.registerTemplates() is helpful and automatically > creates a template and consumerTemplate if they're not defined on a > camelContext. Unfortunately, if there are multiple camelContexts, then it > creates a template for each camelContext with the id of "template", which > will then cause an exception IF the spring application context is not > allowing bean definition overriding. An example of the exception: > {noformat} > Caused by: > org.springframework.beans.factory.parsing.BeanDefinitionParsingException: > Configuration problem: Invalid bean definition with name 'template' defined > in null: Cannot register bean definition [Generic bean: class > [org.apache.camel.spring.CamelProducerTemplateFactoryBean]; scope=; > abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; > autowireCandidate=true; primary=false; factoryBeanName=null; > factoryMethodName=null; initMethodName=null; destroyMethodName=null] for bean > 'template': There is already [Generic bean: class > [org.apache.camel.spring.CamelProducerTemplateFactoryBean]; scope=; > abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; > autowireCandidate=true; primary=false; factoryBeanName=null; > factoryMethodName=null; initMethodName=null; destroyMethodName=null] bound. > Offending resource: class path resource [springfile.xml] > at > org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:72) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.AbstractBeanDefinitionParser.parse(AbstractBeanDefinitionParser.java:82) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.apache.camel.spring.handler.CamelNamespaceHandler.registerTemplates(CamelNamespaceHandler.java:519) > ~[camel-spring-2.11.2.jar:2.11.2] > at > org.apache.camel.spring.handler.CamelNamespaceHandler$CamelContextBeanDefinitionParser.doParse(CamelNamespaceHandler.java:369) > ~[camel-spring-2.11.2.jar:2.11.2] > at > org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser.parseInternal(AbstractSingleBeanDefinitionParser.java:85) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.AbstractBeanDefinitionParser.parse(AbstractBeanDefinitionParser.java:59) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1423) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1413) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:243) > ~[org.springframework.beans-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127) > ~[org.springframework.context-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93) > ~[org.springframework.context-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:131) > ~[org.springframework.context-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:530) > ~[org.springframework.context-3.1.4.RELEASE.jar:3.1.4.RELEASE] > at > org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:444) > ~[org.springframework.context-3.1.4.RELEASE.jar:3.1.4.RELEASE] > {noformat} > This appears to only be a problem if using multiple camel contexts and > setting allowBeanDefinitionOverriding to false. If you need to enforce the > unique bean ids, I suspect a workaround is to define a template with a unique > id for each camelContext in the XML, but then you lose the helpful benefit of > not having to define that for every context. -- This message was sent by Atlassian JIRA (v6.2#6252)