2016-12-06 1 views
0

J'ai une expression pointcut qui fonctionne bien lorsqu'elle est écrite en Java, mais lorsqu'elle est écrite en XML, elle donne une erreur. Puisque mon aspect est écrit dans un projet et que son jar est disponible dans un autre projet, je dois fournir son mapping dans le XML dans d'autres projets utilisant le même aspect dans JAR.
En Java:L'expression pointcut ne fonctionne pas au format XML

@Pointcut("get(java.lang.String com.air.ghl..*) and @annotation(value)") 
public void isDynamicValue(DynamicValue dynamicValue) {} 

@Around("isDynamicValue(dynamicValue)") 
public Object getDynamicString(DynamicValue dynamicValue, ProceedingJoinPoint thisJoinPoint) throws Throwable { 
    System.out.println(thisJoinPoint); 
    System.out.println(" " + dynamicValue); 
    return thisJoinPoint.proceed(); 
} 

En XML:

<bean id="dynamicValueAspect" class="com.air.ghl.util.DynamicValueAspect"/> 
<aop:aspect id="dynamicValue" ref="dynamicValueAspect"> 
    <aop:pointcut id="dynamicValueStringPointCut" expression="get(java.lang.String com.air.ghl..*) and @annotation(value)"/> 
    <aop:around method="getDynamicString" pointcut-ref="dynamicValueStringPointCut"/> 
</aop:aspect 

Erreur lors serveur jusqu'à:

Caused by: org.aspectj.weaver.tools.UnsupportedPointcutPrimitiveException: Pointcut expression 'get(java.lang.String com.air.ghl..*) && @annotation(value)' contains unsupported pointcut primitive 'get' 
at org.aspectj.weaver.tools.PointcutParser.validateKindedPointcut(PointcutParser.java:522) 
at org.aspectj.weaver.tools.PointcutParser.validateAgainstSupportedPrimitives(PointcutParser.java:437) 
at org.aspectj.weaver.tools.PointcutParser.validateAgainstSupportedPrimitives(PointcutParser.java:412) 
at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:311) 
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:294) 
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:208) 
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:194) 
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:183) 
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getMethodMatcher(AspectJExpressionPointcut.java:169) 
at org.springframework.aop.aspectj.AbstractAspectJAdvice.buildSafePointcut(AbstractAspectJAdvice.java:187) 
at org.springframework.aop.aspectj.AspectJPointcutAdvisor.<init>(AspectJPointcutAdvisor.java:51) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148) 

Merci. :)

Répondre

0

De toute évidence, dans votre code, vous utilisiez AspectJ à part entière (peut-être via LTW, weaving à temps de chargement). Alors vous êtes bien avec get() pointcuts. La variante XML est évidemment Spring AOP et comme le dit le message d'erreur, en tant que framework "AOP lite", elle ne supporte pas get parmi plusieurs autres coupes AspectJ, voir le manuel Spring, chapitre AOP, section Supported Pointcut Designators. Il est dit:

Le langage de point complet AspectJ prend en charge les désignateurs de pointeur supplémentaires qui ne sont pas pris en charge dans Spring. Ce sont: appel, get, set, préinitialisation, staticinitialization, initialisation, gestionnaire, adviceexecution, avec code, cflow, cflowbelow, if, @this et @withincode. L'utilisation de ces désignations pointcut dans les expressions pointcut interprété par Spring AOP entraînera le lancement d'une exception IllegalArgumentException.

+0

Merci Kriegaex. N'y a-t-il aucun moyen de l'essayer? Je ne veux pas ajouter la même classe à différents projets. –

+0

Lisez le chapitre AOP et familiarisez-vous avec toutes les options que vous avez avec Spring AOP et les options supplémentaires que vous avez avec AspectJ en combinaison avec Spring. Si vous voulez utiliser 'get()', il n'y a aucun moyen de contourner AspectJ. Si vous voulez rester avec Spring AOP, vous devez refactoriser vos pointcuts pour intercepter les méthodes getter plutôt que l'accès aux champs. – kriegaex