You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (JIRA)" <ji...@apache.org> on 2014/04/27 10:36:15 UTC
[jira] [Resolved] (CAMEL-7390) CamelNamespaceHandler issue when
using Spring's
AbstractRefreshableApplicationContext.setAllowBeanDefinitionOverriding(false)
[ https://issues.apache.org/jira/browse/CAMEL-7390?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Claus Ibsen resolved CAMEL-7390.
--------------------------------
Resolution: Won't Fix
Assignee: Claus Ibsen
> 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
> Assignee: Claus Ibsen
> 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)