Why aspectj-maven-plugin ignore my AnnotationInheritor.aj file? Am I configured something wrong?
I want to advice ItemRepository#getById with custom annotation:
@Repository public interface ItemRepository extends JpaRepository<Item, Long> { // AOP does not work, since autogenerated ItemRepositoryImpl#getById // won't have @MyAnnotation annotation @MyAnnotation public Item getById(Long id); } @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Inherited public @interface MyAnnotation { } @Aspect @Component public class MyAspects { @Around("@annotation(MyAnnotation)") public Object execute(ProceedingJoinPoint joinPoint) { // This advice works correct when @MyAnnotation is placed on class, I tested. // The problem is that I have to put @MyAnnotation on interface method } } Spring Data JPA use interfaces and Java annotations are never inherited from interface to subclass (due JVM limitations). To make my advice work with custom annotations there is a little AspectJ trick. So as described at previous referrence, I created AnnotationInheritor.aj file:
package com.vbakh.somepackage.aspects; // For some reason does not work. WHY? public aspect AnnotationInheritor { declare @method : void ItemRepository+.getById() : @MyAnnotation; } And add the following configurations to my pom.xml:
<dependencies> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.6.0</version> <configuration> <source>1.8</source> <target>1.8</target> <!-- IMPORTANT --> <useIncrementalCompilation>false</useIncrementalCompilation> </configuration> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.9</version> <configuration> <complianceLevel>1.8</complianceLevel> <source>1.8</source> <target>1.8</target> <showWeaveInfo>true</showWeaveInfo> <verbose>true</verbose> <Xlint>ignore</Xlint> <encoding>UTF-8 </encoding> </configuration> <executions> <execution> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> </execution> </executions> <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.8.10</version> </dependency> </dependencies> </plugin> </plugins> </build> P.S. Is there any way to perform the same logic without *.aj files? Means with *.java files.
<phase>process-sources</phase>for the latter. Tell me if that helps, with 16k reputation you seem to be an experienced developer. During the weekend I might be able to follow up on this with more info.@DeclareAnnotationannotation, but it hasn't been implemented yet.