Bonjour,

J'ai une application web Spring/Hibernate qui utilise l'API java.lang.reflect.

J'ai développé des tests unitaires d'intégration, ceux-ci passe très bien sous Eclipse, sous maven en local et sous maven sur Hudson. Mais ne passent pas quand je lance lance un job Hudson en invoquant sonar:sonar.

En effet d'après mes recherches, sous sonar, je sors de ma session Hibernate (ou le contexte transactionnelle n'est plus pris en compte) quand j'invoque une méthode via l'api java.lang.reflect (method.invoke(...)).

Je me suis connecté en débug durant le job Hudson et j'ai regarder la stack a l'entrée de ma méthode que j'ai comparé à celle que j'obtiens en local et j'ai constaté que durant le passage des test sur sonar après les aop on a dans les stacks :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
GeneratedMethodAccessor276.invoke(Object, Object[]) line: not available	
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
Method.invoke(Object, Object...) line: 597
Alors que dans tout les autres cas, j'ai :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39	
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
Method.invoke(Object, Object...) line: 597
Avec la fin de stack identique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
UserCoreBusinessService.createUser(BasicFunctionalityInformations, User, Integer, String, List<Profile>, List<Organization>) line: 123	
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]	
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39	
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25	
Method.invoke(Object, Object...) line: 597	
MethodInvokerService.invokeMethod(IServiceController<?>, IService, Method, IUFCProvider, Map<String,Object>) line: 63
On vois bien que normalement on utilise toujours NativeMethodAccessorImpl que se soit par le biais des bean spring et lorsque l'on invoque directement notre méthode par reflection. Alors que dans sonar c'est GeneratedMethodAccessor### qui est utilisé dans le cas des Beans Spring.

Je pense que cette différence me fait perdre mon context transactionnel.

Selon ma conf j'ai <tx:method name="*" propagation="REQUIRED"/> sur toute les classes de mon package.

J'espère avoir été assez clair dans mes explications, si vous voulez des détails plus précis ou les stack complètes je reste à votre dispositions.

Sanby