当前位置: 首页 > 知识库问答 >
问题:

@Autowired不适用于拦截器

辛弘壮
2023-03-14

我正在使用Apache CXF开发REST服务。我正在使用Spring3.1注释来连接bean。我编写了一个拦截器,它截取我的REST方法以进行监视。要做到这一点,我必须自动连接作为库添加到项目中的Monitor类@自动连线在这种情况下似乎不起作用,导致NPE。我做错什么了吗?

@Aspect
@Component
public class ApplicationMonitoring {

Logger logger = LoggerFactory.getLogger(ApplicationMonitoring.class);

@Autowired
private Monitor monitor;

@Around("execution(* com.abc.xyz.rest.CustomerResource.getCustomerByAccountNumber(..))")
public Object invoke(ProceedingJoinPoint joinPoint) throws Throwable {
    String methodName = joinPoint.getSignature().getName();

    long start = System.currentTimeMillis();
    try {
        // proceed to original method call
        Object result = joinPoint.proceed();
        monitor.elapsedTime(methodName, System.currentTimeMillis() - start);
            return result;
    } catch (Exception e) {
        throw e;
    }
}

应用上下文:

.................
......
<context:spring-configured />

<context:component-scan base-package="com.abc">
    <context:exclude-filter expression="org.springframework.stereotype.Controller"
        type="annotation" />
</context:component-scan>

<context:annotation-config/>  

.............

共有2个答案

皮景龙
2023-03-14

在这个博客中找到了解决方案

aspect是一个单例对象,在Spring容器外部创建。XML配置的解决方案是使用Spring的工厂方法来检索方面。

<bean id="monitoringAspect" class="com.myaapp.ApplicationMonitoring" 
   factory-method="aspectOf" />

通过此配置,该方面将被视为任何其他Springbean,自动布线将正常工作。

向锦
2023-03-14

我不是Spring的大师,但就我所知,我会尽我所能把它用语言表达出来。

我想你已经注意到了,但是@Aspect不是基于Spring的,所以为了扫描它,你需要添加

<bean id="id_of_your_bean" class="ApplicationMonitoring" factory-method="aspectOf">
     //other stuff
</bean>

 类似资料:
  • 我用Spring framework 4.0.2 Spring MVC JavaMelody构建了我的应用程序,用于监控应用程序性能。使用LoginInterceptor,除javamelody dashboard:mydomain外,没有登录会话的其他所有请求URL都将重定向到登录页面。com/监控;我需要用过滤器替换拦截器吗?因为RequestParameterFilter中设置的断点可以很好

  • 我有一个Flume组件在监听Syslog流。我做了一个自定义的拦截器来修改调用,但它不起作用。我做错了什么?谢谢你,Andrea 拦截器是一个编译良好的JAR文件,位于@FLUME_HOME/bin目录中 系统将事件记录在文件中而不修改它们,这是相关的DEBUG日志:

  • 现在,当我到达spring-boot应用程序的endpoint时,它工作得很好 基本上,它根本不调用preandle。我错过了什么????

  • 问题内容: 我试图在AngularJS中制作一个拦截器。我是AngularJS的新手,并找到了一些Interceptor的示例,但无法使其正常工作。 这里有我的app.js文件,其中包含所有相关代码。我还有一个控制器,该控制器调用REST api并返回JSONP。 首先,我声明模块,然后进行配置(定义拦截器)。现在它应该捕获所有请求并将其输出到控制台… 用app.factory创建拦截器是否错误?

  • 拦截驱动器 bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径

  • 我根据JBoss文档创建了一个拦截器。 为了测试拦截器,我把: 现在,我想使用WeldJUnit4Runner类在单元测试中测试这个拦截器。 现在的预期产出当然是 但结果却是 主要问题是,如果我在测试中注入bean,这也是正确的:我调用的bean的第一个方法被拦截,但是如果这个方法调用另一个方法,拦截器就不会被调用。 任何想法都非常感谢! 我只是按照@adrobisch的建议修改了我的代码,效果如