2016-08-09 2 views
0

Я пытаюсь использовать Spring AOP, но у меня проблемы. Вот оно:Spring бросает ClassNotFound для пользовательских Аспект

Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [org.codarama.diet.event.aop.ProfilingAdvice] for bean with name 'profilingAdvice' defined in class path resource [META-INF/test-contexts/testProfilingAdvice.xml]; nested exception is java.lang.ClassNotFoundException: org.codarama.diet.event.aop.ProfilingAdvice 

Вот совет профилирование:

package org.codarama.diet.event.aop; 

import com.google.common.base.Stopwatch; 
import org.aspectj.lang.ProceedingJoinPoint; 
import org.aspectj.lang.annotation.Around; 
import org.aspectj.lang.annotation.Aspect; 
import org.codarama.diet.component.ListenableComponent; 
import org.codarama.diet.event.model.MinimizationEndEvent; 
import org.codarama.diet.event.model.MinimizationEvent; 
import org.codarama.diet.event.model.MinimizationStartEvent; 

import java.util.Set; 

@Aspect 
public class ProfilingAdvice extends ListenableComponent { 

    @Around("org.codarama.diet.event.aop.IndexingAspect.get()") 
    public Object profileGet(ProceedingJoinPoint pjp) throws Throwable { 
    // some code 
    } 

    @Around("org.codarama.diet.event.aop.IndexingAspect.index()") 
    public Object profileIndex(ProceedingJoinPoint pjp) throws Throwable { 
    // some more code 
    } 

    @Around("org.codarama.diet.event.aop.MinimizationAspect.minimize()") 
    public Object profileMinimize(ProceedingJoinPoint pjp) throws Throwable { 
    // and some more code 
    } 
} 

Я использую XML-конфигурации, вот соответствующие части (я надеюсь):

<context:spring-configured/> 
<context:annotation-config/> 
<aop:aspectj-autoproxy/> 

... 

<bean id="indexingAspect" class="org.codarama.diet.event.aop.IndexingAspect"/> 
<bean id="minimizationAspect" class="org.codarama.diet.event.aop.MinimizationAspect"/> 
<bean id="profilingAdvice" class="org.codarama.diet.event.aop.ProfilingAdvice" parent="listenableComponent"/> 

... 

<bean id="listenableComponent" class="org.codarama.diet.component.ListenableComponent" abstract="true"> 
    <property name="eventBus" ref="statusUpdateEventBus"/> 
</bean> 

<bean id="statusUpdateEventBus" class="com.google.common.eventbus.AsyncEventBus"> 
    <constructor-arg ref="eventBusExecutor"/> 
</bean> 

<bean id="eventBusExecutor" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool"> 
    <constructor-arg value="1"/> 
</bean> 

и ПОМ:

<org.springframework.version> 
     4.3.1.RELEASE 
    </org.springframework.version> 
    <aspectj.version>1.8.9</aspectj.version> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-expression</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-beans</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aop</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-aspects</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context-support</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-test</artifactId> 
     <version>${org.springframework.version}</version> 
     <scope>test</scope> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${org.springframework.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjrt</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.aspectj</groupId> 
     <artifactId>aspectjweaver</artifactId> 
     <version>${aspectj.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>aopalliance</groupId> 
     <artifactId>aopalliance</artifactId> 
     <version>1.0</version> 
    </dependency> 

Извините за длинный пост, но я прочитал и перечитал несколько руководств, и в настоящее время я немного в тупике. Спасибо.

+1

Этот параметр 'context component scan' настроен для этого пакета' org.codarama.diet.event.aop'? –

+0

Хм, нет, мне не хватает компонента-сканирования полностью, но я четко определил xml beans. Для сканирования компонентов AFAIK требуется '@ Component' дополнительно к' @ Aspect'. – Simeon

+2

Что относительно 'listenableComponent' bean? –

ответ

1

Найдено.

Оказалось, что ранее я определил аспект с ключевым словом AspectJ aspect. Как это:

@Aspect 
public aspect ProfilingAdvice extends ListenableComponent { 
    // code 
} 

Я определил его class позже, но независимо от того, что это сделал то, что он сделал файл .aj вместо .java, таким образом javac не компиляции и поэтому файл .class отсутствовал в во время выполнения.

Все, что мне нужно было сделать, это переименовать .aj в .java, и все было в порядке.

Смежные вопросы