2010-04-23 15 views
0

je charge les définitions de haricots singleton supplémentaires lors de l'exécution du fichier jar externe dans XmlWebApplicationContext existante de ma demande:CGLIB erreur proxy après le chargement de la définition de haricot de printemps en XmlWebApplicationContext lors de l'exécution

 

BeanFactory beanFactory = xmlWebApplicationContext.getBeanFactory(); 
DefaultListableBeanFactory defaultFactory = (DefaultListableBeanFactory)beanFactory; 
final URL url = new URL("external.jar"); 
final URL[] urls = {url}; 
ClassLoader loader = new URLClassLoader(urls, this.getClass().getClassLoader()); 
defaultFactory.setBeanClassLoader(loader); 
final ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(defaultFactory); 
final DefaultResourceLoader resourceLoader = new DefaultResourceLoader(); 
resourceLoader.setClassLoader(loader); 
scanner.setResourceLoader(resourceLoader); 
scanner.scan("com.*"); 
Object bean = xmlWebApplicationContext.getBean("externalBean"); 

 

Après tout ci-dessus xmlWebApplicationContext contient toutes les définitions externes de des haricots. Mais quand je suis en train d'obtenir haricot d'exception contexte est jeté:

Couldn't generate CGLIB proxy for class ...

j'ai vu en mode débogage dans le processus d'initialisation du bean premier proxy est générée par org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator

et qu'il est tenté de générer un proxy avec org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator

mais échoue avec l'exception mentionnée.

Répondre

0

Assurez-vous que la fève:

  • n'est pas final
  • a un constructeur non-privé
+0

pas définitif et a constructeur public. étrange mais il fonctionne si haricot initialisée pas dans l'exécution, mais dans le strarting du principal processus régulier de contexte avec les autres haricots. Cela fonctionne également si la définition du bean est ajoutée dans la méthode PostProcessor juste avant le démarrage du contexte principal. J'ai essayé d'actualiser le contexte, mais après l'actualisation, les définitions de beans supplémentaires sont supprimées. – VasylV

+0

rafraîchissement tous les haricots et reconstitue ce n'est pas la meilleure solution pour moi, mon but est de charger la définition de haricots à l'exécution sans redémarrage de tous les principaux contexte web du printemps – VasylV

+0

donner à la classe (modifier votre question) – Bozho

0

cause a été déterminée. Deuxième définition créateur de procuration a été fondée au printemps-manager.xml-commun:

 
"org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator" 
which intercepts beans with names DAO, Dao, *ManagerTarget. 

Au cours de ma création de haricot externe, classLoader de haricot proxy a été mis pour le chargeur de classe système. Le créateur de proxy n'a donc pas trouvé de définition de classe pour le bean externe.

Il semble que sans classe de rafraîchissement chargeur, qui a ajouté à l'usine par défaut est invisible pour certains haricots utilitaires tels créateurs proxy.

Ma solution est d'obtenir le haricot créateur de proxy et de mettre implicitement chargeur classe, mais peut-être une meilleure façon existe pour résoudre ce problème.