AspectJ的春季CrudRepository切点上的方法(AspectJ pointcut on

2019-09-29 07:15发布

我使用Spring的CrudRepository结合注释@RepositoryRestResource实现一个简单的CRUD,应用程序,可以throught一个RESTful API一起使用。 我现在想添加一个AspectJ切入点在我的仓库 ,这样,每当从接口一个CRUD-方法被调用一些功能将被执行。

首先,我继承了Spring的CrudRepository在我自己的界面添加一些自定义功能:

@RepositoryRestResource(collectionResourceRel = "customers", path = "customers")
public interface CustomerRestRepository extends CrudRepository<Customer, Integer>{
   Customer findOneByGuid(@Param("customerGuid") String customerGuid);
   //Other custom methods.
}

一切工作正常,我能够通过我的REST客户端调用此方法。 我没有实现接口CustomerRestRepository因为春天做的工作在后面的一个奇迹。 这是延伸泉的关键优势之一CrudRepository

这个问题,我现在面对的,是这个自定义的方法 添加一个AspectJ切入点 findOneByGuid()将,例如,登录方法的每次调用它的执行之后。

什么我迄今所尝试的是:

@Aspect
public aspect AfterCustomerCrudAspect {
   @Pointcut(
        "execution(* com.x.y.z.CustomerRestRepository.findOneByGuid(..))")
   public void customerCrudMethod() {}

   @AfterReturning("customerCrudMethod()")
   public void doSomething() {
      //Do something
   }
}

我也试过:

1) execution(* com.x.y.z.CustomerRestRepository+.findOneByGuid(..))
2) execution(* org.springframework.data.repository.Repository+.*(..))
3) within(com.x.y.z.CustomerRestRepository)
4) annotation(RepositoryRestResource)

......和许多其他我不记得了。 都具有相同的令人沮丧的结果:该建议是永远不会应用。

顺便说一句,我不面对任何异常,如果我尝试execution(* *.*(..))该意见是运作良好-但当然不限于法findOneByGuid() 因此,我认为我的代码是正确的一般。

我知道这是不可能的接口上设置的切入点。 但因为我没有实现接口CustomerRestRepository由我自己把事情的工作,我需要找到一种方法来设置上的一个接口的方法的切入点-或找一些其他的解决办法。

那么,一个可能的解决方案,这将是实现该接口CustomerRestRepository 。 但后来我有我自己做的所有存储库工作的实施和使用Spring的优势跳过CrudRepository

因此, 我的问题是,如果有设置一个AspectJ切入点就在Spring方法可能性CrudRepository

提前非常感谢所有的答案。

Answer 1:

好吧,我解决我的问题以不同的方式。

有时候,形势比预料的那么复杂。 在弹簧CRUD存储库添加一个AspectJ切入点来执行某些功能,每当一个实体改变是不是最好的主意。 (而在我所知,这是不可能的。)

还有就是要实现我的要求一个更简单的方法:包javax.persistence提供了注解@EntityListeners ,完美套房,这项工作。 因此,注释的实体类的监听器和执行监听器类中所需的功能:

@Entity
@EntityListeners(CustomerEntityListener.class)
//@Table, @NamedQueries and other stuff ...
public class Customer implements Serializable {
   ...
}

在实施EntityListener

public class CustomerEntityListener {
   @PostPersist
   public void customerPostPersist(Customer customer) {
      //Add functionalities
   }
}

EntityListener还提供了注解为@PostUpdate@PostRemove等等- 访问这个网站以获取更多信息 。



文章来源: AspectJ pointcut on method in Spring CrudRepository