I’m facing a pretty weird trouble. I use annotation-driven AspectJ in my App. When I try to proceed my method, I receive null pointers on my autowired fields. (In the service class, which methods I’m invoking in the interceptor). Before the usage of AspectJ the spring context was working just fine. I’m providing my code, maybe I just don’t see that small mistake 🙁 Spent TOO MUCH time finding it. 🙁
Here goes the Aspect class:
@Aspect
@Component
public class SomeInterceptor{
private static final Logger LOGGER = LoggerFactory.getLogger(SomeInterceptor.class);
@Autowired
@Qualifier("webServiceResponseFactory")
protected WebServiceResponseFactory responseFactory;
@Autowired
@Qualifier("configBean")
protected ConfigBean configBean;
public SomeServiceInterceptor () {
LOGGER.info("Some service interceptor was created");
}
@Around("execution(public * pathToMyClassIsCorrect.*(..))")
public Object invoke(ProceedingJoinPoint pjp) throws Throwable {
String securityTokenForMethod = pjp.getArgs()[0].toString();
if (securityTokenForMethod != null) {
LOGGER.info("Proceeding the securityTokenCheck before calling method "
+ pjp.getSignature().getName());
if (validateAccessToken(securityTokenForMethod)) {
return responseFactory
.buildFailedResponse("securityAccessToken is invalid for this request");
}
} else {
throw new Throwable("There was an exception before calling method "
+ pjp.getSignature().getName());
}
try {
LOGGER.info("Calling method " + pjp.getSignature().getName());
Object methodToInvoke = pjp.proceed();
LOGGER.info("Method " + pjp.getSignature().getName()
+ " was called successfully");
return methodToInvoke;
} catch (Throwable e) {
LOGGER.info("Method " + pjp.getSignature().getName() + "threw an exception. ");
boolean verboseError = Boolean.parseBoolean(pjp.getArgs()[1].toString());
return responseFactory.buildErrorResponse(e, verboseError);
}
}
}
My app-context.xml has all of the compontent-scan packages included and the enabled.
Any help is very appreciated.
EDIT
Also, right after the invocation I receive such error:
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
EDIT 2.0:
Just tried to launch the service without the aspect, works fine. So the trouble is really caused by the aspect that intercepts the method of service. :\
EDIT 3.0:
I have added a logger to the constructor. So, as I see, the object is not even created. No idea what could be the reason.
EDIT 4.0:
AspectJ configuration file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-verbose -showWeaveInfo -debug">
<!-- only weave classes in our application-specific packages -->
<include within="com.store.*"/>
<include within="com.store.services.*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="com.store.services.StoreServiceAspect"/>
</aspects>
</aspectj>
<weaver options="-verbose">
<include within="javax.*" />
<include within="org.aspectj.*" />
<include
within="(!@NoWeave com.store.services.*) AND com.bsro.storewebsrv.services.*" />
<dump within="com.store.services.*" />
</weaver>
Found the solution. The problem was that the ltw was not working, because of lack of “Loader” in the app context in Tomcat. So following the 8.8.3 reference guide in Spring, pretty much fixed it. The “aspectOf” was not found because of the reason told above. This error is thrown any times the weaving is failing. Also, the autowired fields became null because of the weaving errors.