java - Spring AOP 方面破坏了上下文

标签 java spring aop aspectj

我面临着一个非常奇怪的麻烦。我在我的应用程序中使用注释驱动的 AspectJ。当我尝试继续我的方法时,我在 Autowiring 字段上收到空指针。 (在服务类中,我在拦截器中调用哪些方法)。在使用 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:

刚刚尝试在没有方面的情况下启动该服务,工作正常。所以问题确实是由拦截service方法的方面造成的。 :\

编辑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>

最佳答案

您的错误处理代码非常容易受到攻击:

LOGGER.info("Method " + pjp.getSignature().getName() + "threw an exception. ");
boolean verboseError = Boolean.parseBoolean(pjp.getArgs()[1].toString());

有很多机会出现新的异常,这些异常会掩盖您刚刚捕获的异常。使异常处理程序防弹:不要解析任何内容,也不要通过调用可能为空值的方法将自己暴露给 NPE。

关于java - Spring AOP 方面破坏了上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14335812/

相关文章:

java - 在 javax.json.spi.JsonProvider.provider(JsonProvider.java :97)) 找不到提供者 org.glassfish.json.JsonProviderImpl

java - 像bean方法一样配置brokerURL

java - 使用 TestNG 和 Spring Transaction 进行并发测试

c# - 通过 IoC 影响带有属性的 AOP;代码味还是优雅?

Java Generic 不推断类型

java - 带有数组参数的 boolean 方法

java - 如何使用 Avro 创建包含对象列表的模式?

java - com.google.api.client 库中的 NoSuchMethodError

java - AOP:基本思想 - 保持对象简单?

java - OSGi WeavingHook 示例