簡體   English   中英

@Autowired不適用於攔截器

[英]@Autowired doesn't work with interceptor

我正在研究使用Apache-CXF開發的REST服務。 我正在使用Spring 3.1注釋來連接bean。 我編寫了一個攔截器,該監聽器可攔截我的REST方法以進行監視。 為此,我必須自動連接Monitor類,該類作為庫添加到我的項目中。 在這種情況下,@ Autowired似乎不起作用,並導致進入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;
    }
}

ApplicationContext:

.................
......
<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/>  

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

我不是Spring的高手,但據我所知,我將盡我最大的努力來表達。

我想您已經注意到了,但是@Aspect不是基於spring的,因此要對其進行掃描,您需要添加<aop:aspectj-autoproxy/> ,此外,我認為問題在於正在創建同一類的兩個實例,每個容器一個(spring和AspectJ),以避免使用工廠方法來檢索與spring容器完全相同的實例(如果我解釋正確,我不確定100%),-請記住首先用以下方式創建方面的一個:

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

此博客中找到了解決方案

方面是一個單例對象,在Spring容器外部創建。 使用XML配置的解決方案是使用Spring的factory方法檢索方面。

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

使用此配置,該方面將被視為任何其他Spring bean,並且自動裝配將正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM