2017-03-01 100 views
0

當我爲其中一個通道啓用WireTap攔截器時,出現以下錯誤。 OotB WireTap攔截器未加載,並在服務器啓動期間拋出以下異常。彈簧集成版本是3.x的無法註冊MBean interceptor.WireTap,javax.management.MalformedObjectNameException:鍵屬性不能爲空

org.springframework.web.context.ContextLoader(ContextLoader.java:319) - 上下文初始化失敗 【JAVA] org.springframework.beans.factory.BeanCreationException:錯誤在從字節數組加載的資源中定義名爲'exporter'的bean:調用init方法失敗;嵌套異常是org.springframework.jmx.export.UnableToRegisterMBeanException:無法使用鍵'org.springframework.integration.channel.interceptor.WireTap#0'註冊MBean [[email protected]e217];嵌套異常是javax.management.MalformedObjectNameException:鍵屬性不能爲空 [java] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1488) [java] at org.springframework.beans。 factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:524) 【JAVA]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 【JAVA]在org.springframework.beans。 factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:295) [java] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) [java] at org.s [org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) [java] at org。[java] springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) [java] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932) [java] at org.springframework。 context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) [java] at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:389) [java] at org.springframework.web.context。 ContextLoader.initWebAppl icationContext(ContextLoader.java:294) [java] at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) [java] at org.broadleafcommerce.common.web.extensibility.MergeContextLoaderListener.contextInitialized( MergeContextLoaderListener.java:50) [java] at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) [java] at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java: 5273) 【JAVA]在org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 【JAVA]在org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895) [ java] at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871) [ java] at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) [java] at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:649) [java] at org .apache.catalina.startup.HostConfig $ DeployDescriptor.run(HostConfig.java:1585) [java] at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471) [java] at java.util .concurrent.FutureTask.run(FutureTask.java:262) [java] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [java] at java.util.concurrent.ThreadPoolExecutor $ Worker.run (的ThreadPoolExecutor。java:615) [java] at java.lang.Thread.run(Thread.java:745) [java]引起者:org.springframework.jmx.export.UnableToRegisterMBeanException:無法註冊MBean [org.springframework.integration .channel.interceptor.WireTap @ 5596e217]與關鍵字'org.springframework.integration.channel.interceptor.WireTap#0';嵌套異常是javax.management.MalformedObjectNameException:鍵屬性不能爲空 [java] at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:602) [java] at org.springframework.jmx.export。 MBeanExporter.registerBeans(MBeanExporter.java:527) 【JAVA]在org.springframework.jmx.export.MBeanExporter.afterPropertiesSet(MBeanExporter.java:413) 【JAVA]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory。 invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1547) 【JAVA]在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1485) 【JAVA] ... 26更

回答

0

我認爲這個錯誤發生在spring-integration v3中。以下是我如何解決它。

  • 創建自定義類擴展WireTap,定義spring bean。
  • 使用ManagedResource註釋來提供名稱,這應該與Spring bean名稱匹配。
  • 將攔截器添加到需要點擊的頻道。

發表這個,我能夠成功地點擊頻道。

您不需要重寫自定義類中的任何方法,只需添加類似於WireTap類的構造函數即可。簡而言之,我創建了自己的攔截器類,並用它來點擊頻道。

@ManagedResource(objectName = "com.xyz.channel.interceptor:name=wireTapExtended") public class WireTapExtended extends WireTap

<int:channel id="channelIdToTap"> 
    <int:interceptors> 
     <int:ref bean="wireTapExtended" /> 
    </int:interceptors> 
</int:channel> 
<bean id="wireTapExtended" name="wireTapExtended" class="com.xyz.channel.interceptor.WireTapExtended"> 
    <constructor-arg name="channel" ref="channelIdToTap" /> 
</bean> 

我看這只是MBean的配置

<bean id="jmxExporterSite" class="org.springframework.jmx.export.MBeanExporter" lazy-init="false"> <property name="server" ref="mbeanServer" /> <property name="registrationBehaviorName" value="REGISTRATION_REPLACE_EXISTING"/> <property name="beans"> <map> <entry key="SpringBeans:name=hibernateStatisticsMBeanSite" value-ref="hibernateStatisticsMBeanSite" /> <entry key="SpringBeans:name=ehCacheManagerMBean" value-ref="cacheManager" /> </map> </property> </bean> 
+1

有趣的...將是巨大的,看看你的'MBeanExporter'配置,試圖重現當前版本。儘管看起來像'ObjectNamingStrategy',但它返回null。雖然真正的Spring集成'3.0'是古老的...... –

+0

評論中的代碼是不可讀的。你應該使用編輯爲您的問題 –

+0

哎呀抱歉,在我的答案更新。 –