Spring бросает ClassNotFound для пользовательского аспекта

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

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 ответ

Нашел это.

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

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

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

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

Другие вопросы по тегам