我配置了兩個公共類,如Spring應用程序上下文如下:爲什麼混合的Spring AOP代理機制(CGLIB和JDKDynmic)不起作用
public class LoadErrorData{
private ExceptionData exceptionData;
public LoadErrorData() { }
// reminder
}
public class ExceptionData implements Serializable{
private Resource exceptionDataResource;
public ExceptionData() { }
// reminder
}
春天的applicationContext.xml:
<beans:bean id="loadErrorData" class="com.startup.LoadErrorData" init-method="startup">
<beans:property name="exceptionData" ref="exceptionData"/>
</beans:bean>
<beans:bean id="exceptionData" class="com.server.ExceptionData" init-method="startup">
<beans:property name="exceptionDataResource" value="classpath:${exception.datafile.path}"/>
</beans:bean>
它給下面的異常而初始化:
2013年10月7日下午1點45分21秒org.apache.catalina.core.Stand ardContext listenerStart嚴重:異常發送上下文初始化事件來 類的 監聽器實例org.springframework.web.context.ContextLoaderListener org.springframework.beans.factory.BeanCreationException:錯誤 創建具有名稱豆「loadErrorData」類路徑限定資源 [spring/startup-config.xml]:bean初始化失敗;嵌套0例外是 org.springframework.beans.ConversionNotSupportedException:未能類型的 轉換屬性值「com.sun.proxy $ Proxy12實施 了java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework。 aop.framework.Advice' '所需類型'com.server.IICExceptionData'屬性 'exceptionData';嵌套異常是java.lang.IllegalStateException: 無法轉換[com.sun.proxy。$ Proxy12實現 java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]類型的值, 所需類型[com.server.IICExceptionData用於屬性 「exceptionData」: 在 不匹配編輯器或轉換策略在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)發現org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFact ory.java:294) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java: 291) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) 在 org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 在 org.springframework.web.context .ContextLoader.initWebApplicationContext(ContextLoader.java:283) 在 org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java :4723) at org.apache.catalina.core.StandardContext $ 1.call(StandardContext。java:5226) at org.apache.catalina.core.StandardContext $ 1.call(StandardContext.java:5221) at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:334) at java。 util.concurrent.FutureTask.run(FutureTask.java:166)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java :615) at java.lang.Thread.run(Thread.java:724)引起: org.springframework.beans.ConversionNotSupportedException:未能到 轉換類型爲'com.sun.proxy。$ Proxy12的屬性值實施 java.io.Serializable接口,org.springframework.aop.SpringProxy,org.springframewo rk.aop.framework.Advice' to required type'com.server.IICExceptionData'for property 'exceptionData';嵌套異常是java.lang.IllegalStateException: 無法轉換[com.sun.proxy。$ Proxy12實現 java.io.Serializable,org.springframework.aop.SpringProxy,org.springframework.aop.framework.Advised]類型的值, 所需類型[com.server.IICExceptionData用於屬性 「exceptionData」:沒有在 org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:485) 發現在 org.springframework匹配編輯器或轉換策略。 beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:516) 在 org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:510) 在 org.springframework.beans.fact ory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1406) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1365) 在 org.springframework.beans.factory.support。 java.lang.IllegalStateException:AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1118) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) ... 19多個所致不能轉換 類型爲[com.sun.proxy。$ Proxy12的值,實現爲 java.io.Serializable,org.springframework.aop.SpringProx y,org.springframework.aop.framework.Advised] 必需類型[com.server.IICExceptionData]屬性 'exceptionData':沒有匹配的編輯器或轉換策略在 找到org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate的.java:241) 在 org.springframework.beans.BeanWrapperImpl.convertIfNecessary(BeanWrapperImpl.java:470) ...... 25多個
但是當我把
<aop:scoped-proxy proxy-target-class="true"/>
在ExceptionData
bean的配置或者如果我刪除
implements Serializable
從ExceptionData
異常消失。我的AOP切入點如下:
expression="execution(* com..*(..))"
看來,春天正試圖建立CGLIB代理豆LoadErrorData ,因爲它確實實現(因爲它沒有實現任何接口)和JDKdynamicProxy它的依賴ExceptionData (接口Serializable)。它不能這樣做。因爲當我告訴spring爲ExceptionData顯式創建CGLIB代理時,它工作正常。這是爲什麼?爲什麼它不能爲一個bean(ExceptionData)創建JDKDynamic Proxy,它是它嘗試創建CGLIB代理的bean(LoadErrorData)的依賴關係?據文件說,Spring會自動檢測它。
如果我將LoadErrorData中存儲的實例變量的類型更改爲Serializable,它會起作用嗎?從邏輯上講,它應該正確嗎? –
然後注入將會發生,但是你只用'Serializable'做什麼?你不能將它轉換爲ExceptionData ... –
correct..it意味着我應該編程到一些有意義的接口,而不僅僅是分類或標記接口(好的舊設計主體),感謝@M。 Deinum –