Frühjahr: CGLIB Ist erforderlich für die Injektion von einer konkreten Klasse, die mit @Resource
Habe ich konfiguriert Frühjahr 3.0.6 LTW mit AspectJ verwenden spring-instrument.jar und:
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
Beim entfernen von CGLIB aus Abhängigkeiten, ich bin immer die folgende Ausnahme auch nach MyBean erstellt wird (und der @PostConstruct wird ausgeführt):
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'crawlItemService' defined in file [/path/to/project/foo/bar/MyBean.class]: Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:527)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:291)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:288)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:435)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:409)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:541)
at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:297)
... 72 more
Caused by: org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.
at org.springframework.aop.framework.DefaultAopProxyFactory.createAopProxy(DefaultAopProxyFactory.java:67)
at org.springframework.aop.framework.ProxyCreatorSupport.createAopProxy(ProxyCreatorSupport.java:104)
at org.springframework.aop.framework.ProxyFactory.getProxy(ProxyFactory.java:112)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.createProxy(AbstractAutoProxyCreator.java:476)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:362)
at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:322)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:407)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1426)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)
... 83 more
Bedeutet es, dass ich CGLIB auch in der Existenz eines load-time weaver?
sind Sie proxying eine Schnittstelle oder eine Klasse?
es ist konkrete Klasse, wie bereits erwähnt.
Frühjahr CGLIB verwendet für alle seine moderne features. Sie wird nicht weit kommen ohne ihn.
Welche features? Ich bin mit all JMX, Planung, AOP, TX und IoC mit LTW.
Mehrere, die CGLIB.
es ist konkrete Klasse, wie bereits erwähnt.
Frühjahr CGLIB verwendet für alle seine moderne features. Sie wird nicht weit kommen ohne ihn.
Welche features? Ich bin mit all JMX, Planung, AOP, TX und IoC mit LTW.
Mehrere, die CGLIB.
InformationsquelleAutor Mohsen | 2011-11-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach über 3 Stunden von Untersuchungen des Codes und ändern der Spring-bean-definition XML-Dateien habe ich endlich das problem gefunden. Diese könnte aus diesem Teil der stacktrace, das merkte ich nach dem finden der Lösung:
Basierend auf dem Hinweis hier, ich änderte alle proxy-target-class-Attribute auf false in
<aop:config>
,<aop:aspectj-autoproxy>
, und<tx:annotation-driven>
, aber ohne Erfolg.Dann fing ich an, entfernen von teilen meiner XML-definition zu finden, welche dieses problem behebt. Kommentieren
<task:annotation-driven>
geholfen und das problem gelöst. Ich sah dann, dass dieses element hat einemode
Attribut, welches ich nicht angegeben, sodass der Standardwert,proxy
, verwendet wird, und so CGLIB ist erforderlich. Als ich geändertmode="aspectj"
das problem gelöst:@Async
annotation irgendwo? Die CGLIB-proxy sollte nicht generiert werden für Klassen, die nicht mit solchen Methoden.Danke, ja ich hatte
@Async
. CGLIB arbeitet mit@Async
wenn die asynchrone Methode nicht aufgerufen wird, aus einem anderen Verfahren in der gleichen Bohne. (dies ist ein bekanntes problem mit CGLIB), Aber es funktioniert, wenn Sie rufen Sie die asynchrone Methode aus einer anderen bean in der die Quell-bean injiziert wird.InformationsquelleAutor Mohsen
Nein, aber es ist notwendig, zu erstellen AOP-proxies (Nicht-proxy-target-class). Hat deine Klasse eine haben:
@Transactional
@Cacheable
@Async
Anmerkungen? Oder vielleicht gibt es einige externe Aspekte rund um die Methoden dieser Klasse? Dennoch AspectJ-compiler sollte sich darum kümmern, Weben, ANMUTIGEN CGLIB sollte nicht verwendet werden. Können Sie uns zeigen, Ihren code?
In meinem Fall richtig zu aktivieren, laden Sie Zeit die Weberei für die Transaktion Unterstützung, die ich hinzufügen musste:
Haben Sie einen Blick auf eine Beispiel.
Siehe mein edit. Auch eine schnelle Lesen Sie meine Artikel über proyxing und Transaktionen.
Sind Sie sicher, dass: <aop:config proxy-target-class="true"/>. Die Dokumentation sagt: Attribut : proxy-target-class class-based (CGLIB) proxies erstellt werden? Standardmäßig standard-Java-interface-basierten proxies erstellt werden.
Nein, ich bin nicht sicher, ich habe nur kopiert von einer funktionierenden code. Probieren Sie es aus und spielen Sie mit einem debugger.
Sollte dies falsch sein, sicher. Siehe "Hinweis" hier
InformationsquelleAutor Tomasz Nurkiewicz
Wenn du mit Spring APO müssen Sie CGLIB.
Es gibt zwei Möglichkeiten, um dies zu Ihrem Projekt
http://www.java2s.com/Code/Jar/c/Downloadcglib22jar.htm
Fügen Sie die Maven-dependency in Ihrem pom.xml Datei
https://mvnrepository.com/artifact/cglib/cglib/2.2.2
InformationsquelleAutor Gani