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 :
Alors que dans tout les autres cas, j'ai :
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
Avec la fin de stack identique :
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
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.
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
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
Partager