Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring AOP方面破坏了上下文_Java_Spring_Aop_Aspectj - Fatal编程技术网

Java Spring AOP方面破坏了上下文

Java Spring AOP方面破坏了上下文,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我正面临一个相当奇怪的麻烦。我在我的应用程序中使用注释驱动的AspectJ。当我尝试继续我的方法时,我在自动连接的字段上收到空指针。(在服务类中,我在拦截器中调用的方法)。在使用AspectJ之前,spring上下文工作得很好。我正在提供我的代码,也许我只是没有看到那个小错误:(花了太多时间寻找它。)( 下面是Aspect类: @Aspect @Component public class SomeInterceptor{ private static final Logger LOGGER

我正面临一个相当奇怪的麻烦。我在我的应用程序中使用注释驱动的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);
    }
}

}
My 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>

您的错误处理代码易受攻击:

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

新异常可能会掩盖您刚刚捕获的异常。请确保异常处理程序防弹:不要解析任何内容,也不要通过调用可能为空的值的方法将自己暴露于NPE中。

我基于您最后的评论,这是AspectJ aspect

@Autowired
将不适用于AspectJ方面。修复方法是使用工厂方法
aspectOf
以这种方式在方面中注入所需内容:

<bean class="SomeInterceptor" factory-method="aspectOf">
  <property name="webServiceResponseFactory" ref="..."/>
</bean>


找到了解决方案。问题是ltw无法工作,因为Tomcat中的应用程序上下文中缺少“Loader”。因此,遵循Spring中的8.8.3参考指南,基本上解决了这个问题。“aspectOf”由于上述原因,找不到。每当编织失败时都会抛出此错误。此外,由于编织错误,自动连接字段变为空。

是否使用AspectJ或AspectJ样式的Spring AOP?这有很大的区别!请参阅我翻阅的所有文档:(尽管如此,您的问题标题和第二句话仍然相互矛盾。它是:Spring AOP还是AspectJ?它是AspectJ,是的。我的错。太累了:(好的。谢谢,刚刚修复了它。但没有更改。只是得到了“未找到匹配的工厂方法:工厂方法'aspectOf'错误。”好的,那么在你的AspectJ设置中有一些东西被关闭了,因为AspectJ编译器将
aspectOf
hasAspect
方法注入到AspectJ中。你能不能多分享一点你的aspects相关配置谢谢,所以你基本上是在使用加载时编织的权利-如果是的话,请显示configurat关于如何设置ltw的详细信息-instrumentation jar等,只是为了确保设置正确并更新了lyaop.xml。此外,我的上下文包含您所拥有的weaver选项“-verbose-showWeaveInfo-debug”应该已经显示了正确编织的类-您是否可以确认您看到了编织的相关类。此外,@Component注释应该从方面删除(不应该有任何副作用,但以防万一)。我假设您也使用
-javaagent:
启动jvm?