Duplicate spring bean id問題排查

來源:互聯網
上載者:User
現象 應用任務運行異常
{code}Caused by: java.lang.IllegalStateException: Duplicate spring bean id realnameAuthPubService        at com.alibaba.dubbo.rpc.config.spring.schema.DubboBeanDefinitionParser.parse(DubboBeanDefinitionParser.java:87)        at com.alibaba.dubbo.rpc.config.spring.schema.DubboBeanDefinitionParser.parse(DubboBeanDefinitionParser.java:63)        at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:69)        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1297)        at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1287)        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:135)        at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:92)        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:507)        at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:398){code}
排查
查看代碼,確實有id為realnameAuthPubService的重複配置,不過已經存在很久了,之前都沒有問題。

問題出現的當天僅有dubbo升級需求發布,所以定位到是dubbo升級引發了這個一直存在的問題

原因

spring對於id重複的預設處理策略是覆蓋,如DefaultListableBeanFactory.registerBeanDefinition,dubbo之前沒做特殊處理,所以對重複的id會覆蓋,所以一直沒有報錯
{code}...synchronized (this.beanDefinitionMap) {Object oldBeanDefinition = this.beanDefinitionMap.get(beanName);if (oldBeanDefinition != null) {                                ##allowBeanDefinitionOverriding預設值為tureif (!this.allowBeanDefinitionOverriding) {throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName,"Cannot register bean definition [" + beanDefinition + "] for bean '" + beanName +"': There is already [" + oldBeanDefinition + "] bound.");}else {if (this.logger.isInfoEnabled()) {this.logger.info("Overriding bean definition for bean '" + beanName +"': replacing [" + oldBeanDefinition + "] with [" + beanDefinition + "]");}}}else {this.beanDefinitionNames.add(beanName);this.frozenBeanDefinitionNames = null;}                        ##如果原來有,覆蓋this.beanDefinitionMap.put(beanName, beanDefinition);...{code}
dubbo的新版本對重複的id做了特殊處理,如果有重複直接拋異常,所以出現問題
{code}DubboBeanDefinitionParser.parse   private BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass, boolean required) {        ...        if (id != null && id.length() > 0) {            ###判斷是否已經存在,存在則拋出異常            if (parserContext.getRegistry().containsBeanDefinition(id))  {        throw new IllegalStateException("Duplicate spring bean id " + id);        }            parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);        }        ...   }{code}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.