Bonjour à tous,

Je veux tisser un aspect sur l'annotation @Autowired pour détecter les échecs de résolution des beans, dans le cadre d'un portage depuis un environnement Carbon.
L'idée, c'est d'injecter dans les composants convertis en Spring des compsoants Carbon avec l'annotation Spring. Comme ça, au fur et à mesure des protages, je n'aurai pas à revenir sur ces injections.


Ma première idée a été de tisser un aspect NoSuchBeanException (throwing) sur @Autowired ; mais je ne suis pas parvenu à tisser sur une annotation ; et puis au moment de l'exception, le mal est fait : impossible de bloquer l'exception a priori.

Du coup, j'ai fait ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
	<aop:aspectj-autoproxy />
	<bean id="carbonAutowiredAdvice" class="com.egencia.carbon.components.CarbonAutowiredAdvice" />
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
@Aspect
public class CarbonAutowiredAdvice {
    private static final Log LOG = LogFactory.getLog(CarbonAutowiredAdvice.class);
 
    @Around("execution(* org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(..)) " +
            "&& args(descriptor,beanName)")
    public Object carbonAutowired(ProceedingJoinPoint invocation,
                                  DependencyDescriptor descriptor, String beanName)
    		throws Throwable {
    	Object result = null;
    	try {
			result = invocation.proceed();
		} catch (NoSuchBeanDefinitionException se) {
			LOG.info("////////// attempt to inject Carbon component...");
			try {
		    	// retrouver l'interface visée
				Class c = Class.forName(beanName);
				assert c.isInterface();
		    	// chercher le champ DEFAULT_COMPONENT_PATH
				Field f = c.getField("DEFAULT_COMPONENT_PATH");
				String componentPath = (String) f.get(null);	//FIXME ok champs static ?
 
				// retrouver le composant dans Carbon
				result = Lookup.getInstance().fetchComponent(componentPath);
			} catch (Exception ce) {
				LOG.debug(ce);
				throw se;	// en cas d'échec, on se fait oublier
			}
		}
		return result;
	}
}

Mais rien ne se passe. J'ai l'impression que le tissage n'est implémenté qu'après l'instanciation des beans, non ?
Si quelqu'un voit une erreur dans le raisonnement ou le code, a une autre idée... je suis preneur parce que là : je vais baisser les bras ;-)
Merci d'avance.