我面临一个非常奇怪的麻烦。我在我的应用程序中使用注释驱动的AspectJ。当我尝试继续我的方法时,我在自动连接的字段上收到空指针。 (在服务类中,我在拦截器中调用哪些方法)。在使用AspectJ之前,spring上下文工作正常。我提供了我的代码,也许我只是没有看到这个小错误:(花了很多时间找到它。:(
这是Aspect类:
@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);
}
}
}
我的app-context.xml包含所有组件扫描包和启用。
非常感谢任何帮助。
修改
此外,在调用之后我收到了这样的错误:
SEVERE: The RuntimeException could not be mapped to a response, re-throwing to the HTTP container
编辑2.0:
试图在没有方面的情况下启动服务,工作正常。所以问题实际上是由拦截服务方法的方面引起的。 :\
编辑3.0:
我在构造函数中添加了一个记录器。所以,正如我所见,甚至没有创建对象。不知道可能是什么原因。
编辑4.0: AspectJ配置文件:
<?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>
答案 0 :(得分:1)
您的错误处理代码非常容易受到攻击:
LOGGER.info("Method " + pjp.getSignature().getName() + "threw an exception. ");
boolean verboseError = Boolean.parseBoolean(pjp.getArgs()[1].toString());
新的例外有很多机会可以掩盖您刚抓到的那个。使异常处理程序具有防范性:不要解析任何东西,也不要通过调用可能为空的值的方法将自己暴露给NPE。
答案 1 :(得分:1)
我基于你的最后评论,这是AspectJ方面。
@Autowired
不适用于AspectJ方面。修复方法是使用工厂方法aspectOf
以这种方式注入您所需的内容:
<bean class="SomeInterceptor" factory-method="aspectOf">
<property name="webServiceResponseFactory" ref="..."/>
</bean>
答案 2 :(得分:0)
找到解决方案。问题是由于Tomcat中的应用程序上下文中缺少“Loader”,因此ltw无法正常工作。所以按照Spring中的8.8.3参考指南,几乎修复了它。由于上述原因,未找到“aspectOf”。编织失败时会抛出此错误。此外,由于编织错误,自动装配的字段变为空。