Printemps: Est CGLIB nécessaire pour l'injection d'un béton de classe à l'aide de @Resource
J'ai configuré le Printemps 3.0.6 avec AspectJ LTW à l'aide de spring-instrument.jar et:
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" />
Lors de la suppression de CGLIB de dépendances, je suis l'exception suivante, même après MyBean est créé (et son @PostConstruct est exécutée):
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
Veut dire que je devrais avoir CGLIB même dans l'existence d'un temps de chargement de tisserand?
êtes-vous le proxy d'une interface ou une classe?
c'est la classe de béton, comme mentionné.
Spring utilise CGLIB pour l'ensemble de ses fonctionnalités modernes. Vous n'irez pas loin sans elle.
Quelles fonctionnalités? Je suis l'aide de tous JMX, de la Planification, de l'AOP, TX et le Cio avec LTW.
Plusieurs utilisation CGLIB.
c'est la classe de béton, comme mentionné.
Spring utilise CGLIB pour l'ensemble de ses fonctionnalités modernes. Vous n'irez pas loin sans elle.
Quelles fonctionnalités? Je suis l'aide de tous JMX, de la Planification, de l'AOP, TX et le Cio avec LTW.
Plusieurs utilisation CGLIB.
OriginalL'auteur Mohsen | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
Après plus de 3 heures d'enquêtes du code et l'évolution de Printemps bean définition XMLs, j'ai enfin trouvé le problème. Cela pourrait être trouvé à partir de cette partie de la stacktrace, j'ai remarqué après avoir trouvé la solution:
Basé sur la note ici, j'ai changé tous les proxy-cible-les attributs de classe à false dans
<aop:config>
,<aop:aspectj-autoproxy>
, et<tx:annotation-driven>
, mais sans succès.Puis j'ai commencé à enlever les parties de mon XML de définition pour trouver celui qui résout ce problème. Commentant
<task:annotation-driven>
aidé et le problème résolu. J'ai alors vu que cet élément a unmode
attribut que je n'ai pas spécifié, sa valeur par défaut,proxy
, est utilisé, et donc CGLIB est nécessaire. Comme j'ai changémode="aspectj"
le problème résolu:@Async
annotation quelque part? Le CGLIB proxy ne doit pas être généré pour les classes qui n'ont pas de telles méthodes.Merci, oui j'ai eu
@Async
. CGLIB fonctionne avec@Async
si votre méthode asynchrone est pas appelée à partir d'une autre méthode de la même bean. (c'est un problème connu avec CGLIB), Mais il fonctionne lorsque vous appelez votre méthode asynchrone à partir d'un autre fève dans lequel la source de haricot est injecté.OriginalL'auteur Mohsen
Pas, mais il est nécessaire de créer des AOP procurations (Ne peut pas proxy classe cible). Est-ce que votre classe:
@Transactional
@Cacheable
@Async
annotations? Ou peut-être il ya certains aspects extérieurs autour des méthodes de cette classe? Néanmoins, AspectJ compilateur doit prendre soin de tissage, AFAIR CGLIB ne doit pas être utilisé. Pouvez-vous nous montrer ton code?
Dans mon cas, pour activer correctement les temps de charge de tissage pour le soutien à la transaction, j'ai dû ajouter:
Ont un coup d'oeil à un exemple de travail.
Voir mon edit. Aussi avoir une lecture rapide de mon article à propos de proyxing et des transactions.
Êtes-vous sûr de: <aop:config proxy-cible class="true"/>. La Documentation dit: Attribut : proxy-cible-classe de la classe de base (CGLIB) les procurations pour être créé? Par défaut, Java standard d'interface proxies sont créés.
Non, je ne suis pas sûr, j'ai juste copié à partir d'un code de travail. Essayez-le et jouez avec un débogueur.
Ce doit être faux pour vous. Voir "Note" ici
OriginalL'auteur Tomasz Nurkiewicz
Si vous utilisez Printemps APO vous devez inclure CGLIB.
Il y a deux façons d'ajouter à votre projet
http://www.java2s.com/Code/Jar/c/Downloadcglib22jar.htm
Ajouter la dépendance Maven dans votre pom.xml fichier
https://mvnrepository.com/artifact/cglib/cglib/2.2.2
OriginalL'auteur Gani