Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[aspectj-users] AspectJ runtime weaving aspects not declared in aop.xml

I have an aop.xml that declares certain aspects that I would like to be
woven by AspectJ LTW. I also have other aspects that I would like Spring
to apply (i want regualr proxy based mechanism for these).

Spring has a restriction that it will not apply any aspects that have
been woven by AspectJ Compiler.It does these by checking for any fields
that start with 'ajc$'.

After struggling to understand why my Aspect that was not declared in
aop.xml was not getting applied, I tried to apply the aspect
programatically using
AspectJProxyFactory aspectJProxyFactory=new AspectJProxyFactory(bean);
aspectJProxyFactory.addAspect(DtExceptionHandlerAdvice.class);

Then I get the exception
org.springframework.aop.framework.AopConfigExcepti on: Advice must be
declared inside an aspect type: Offending method 'public void
ca.xxxx.yy.remote.endpoint.impl.DtExceptionHandler
Advice.runtimeError(java.lang.RuntimeException)' in class
[ca.xxxx.yy.remote.endpoint.impl.DtExceptionHandler Advice]

Once I dig thru I find that the exception message is misleading because
the advice is declared in an aspect type. The issue really is that when
Spring checks if an advice class that is being applied is really an
aspect type it checks for @Aspect to be present, or if its an aspect
type and also if it has any ajc$ variables in it. Ideally the error
message should have said that aspect has been woven by AspectJ Compiler,
but thats another issue anyways.

But really my problem is that AspectJ is weaving an aspect thats not
been declared in its aop.xml file.

Here is my aop.xml file
<aspectj>
<weaver options="-debug -verbose -showWeaveInfo">
<!-- only weave classes in our application-specific packages -->
<include within="org.quartz..*"/>
<include within="ca.xxxx.yy.services..*"/>
<include within="ca.xxxx.yy.dao..*"/>
<include within="ca.xxxx.yy.newdispatch..*"/>
<include within="ca.xxxx.yy.domain.entity.energy..*"/>
<!-- <include within="ca.xxxx.yy.event.reciever..*"/> -->
</weaver>
<aspects>
<!-- weave in just this aspect including only the aspects that we want
woven by AspectJ Runtime -->
<aspect name="ca.xxxx.yy.eventqueue.impl.SystimeAspect"/>
<aspect name="ca.xxxx.yy.services.advices.LimitAdvice"/>
<aspect name="ca.xxxx.yy.services.advices.ApplyDispatchLevelsAdvice"/>
<aspect name="ca.xxxx.yy.services.advices.DDSAvailableOffsetAdvice"/>
<aspect name="ca.xxxx.yy.services.advices.EnergyMarketAuto
ReductionOffsetAdvice"/>
<aspect name="ca.xxxx.yy.services.advices.FilterLongLeadAssetAdvice"/>
<aspect name="ca.xxxx.yy.services.pointcuts.OffsetAspectsPrecedence"/>
</aspects>

and My aspect is declared in a file


package ca.xxxx.yy.remote.endpoint.impl;

@Aspect
public class DtExceptionHandlerAdvice {

@Log
Logger logger;
}

In my debug log I see the line

[AppClassLoader@130c19b] debug weaving
'ca.xxxx.yy.remote.endpoint.impl.DtExceptionHandle rAdvice'

And when running thru my debugger i do see that the
DtExceptionHandlerAdvice does have two variables starting with ajc$
proving that it has indeed been woven by AspectJ load time weaver.

Any reason why this might be happening, Does AspectJ LTW simply pick up
all classes with @Aspect and consider them as aspects, if that is the
case should I now have to exclude the ones that I don't want to be woven
explicitly. 

Any help would be appreciated.

Thanks
-Satish


Back to the top