2016-12-06 23 views
0

У меня есть выражение pointcut, которое отлично работает при написании в java, но когда написано в xml дает ошибку. Поскольку мой аспект написан в одном проекте, и его jar доступен в другом проекте, я должен предоставить его отображение в XML в других проектах, используя тот же самый аспект в JAR.
В Java:Pointcut получить выражение не работает в 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(); 
} 

В 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 

Ошибка при сервер до:

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) 

Спасибо. :)

ответ

0

Очевидно, что в вашем коде вы использовали полноценный AspectJ (возможно, через LTW, ткачество с загрузкой). Тогда вы в порядке с get() pointcuts. Вариант XML - это, очевидно, Spring AOP, и, как сообщается в сообщении об ошибке, как «AOP lite», он не поддерживает get среди нескольких других пунктов pointpoint AspectJ, см. Руководство Spring, глава AOP, раздел Supported Pointcut Designators. В нем написано:

Полный язык pointcut AspectJ поддерживает дополнительные указатели pointcut, которые не поддерживаются весной. Это: call, get, set, preinitialization, staticinitialization, инициализация, обработчик, advexecution, intcode, cflow, cflowbelow, if, @this и @withincode. Использование этих указателей pointcut в выражениях pointcut, интерпретируемых Spring AOP, приведет к тому, что будет выведено исключение IllegalArgumentException.

+0

Thanks Kriegaex. Разве я не могу попробовать это? Я не хочу добавлять тот же класс в разные проекты. –

+0

Просто прочитайте главу АОП и ознакомьтесь со всеми параметрами, которые у вас есть с Spring AOP и дополнительными параметрами, которые у вас есть с AspectJ в сочетании с Spring. Если вы хотите использовать 'get()', AspectJ не существует. Если вы хотите придерживаться Spring AOP, вам необходимо реорганизовать ваши pointcuts для перехвата методов getter, а не для доступа к полям. – kriegaex

 Смежные вопросы

  • Нет связанных вопросов^_^