当前位置: 首页 > 知识库问答 >
问题:

Spring CrudRepository中方法的AspectJ切入点

晏兴发
2023-03-14

我使用Spring的crudrepository和注释@repositoryrestresource来实现一个简单的CRUD-app,可以通过RESTful API使用。现在,我想在我的存储库上添加一个AspectJ切入点,这样每当调用接口中的CRUD-method时,就会执行一些功能。

首先,我扩展了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,因为Spring在后面的工作中是一个奇迹。这是扩展Springs的CrudRepository的关键优点之一。

@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)

...还有许多我不记得了。所有这些都有同样令人沮丧的结果:建议从未被应用。

顺便说一句,我不会遇到任何异常,如果我尝试执行(**.*(..)),建议会很好地工作--当然,并不局限于FindoNebyGuid()方法。因此,我认为我的代码总体上是正确的。

共有1个答案

狄溪叠
2023-03-14

嗯,我用不同的方法解决了我的问题。

有时候,事情并没有想象的那么复杂。在Spring CRUD-repository上添加一个AspectJ切入点来执行一些功能,无论何时更改实体都不是最好的主意。(据我所知,这根本不可能。)

有一种更简单的方法来实现我的需求:包javax.persistence提供的批注@EntityListeners非常适合这项工作。因此,用侦听器注释实体类,并在侦听器类中实现所需的功能:

@Entity
@EntityListeners(CustomerEntityListener.class)
//@Table, @NamedQueries and other stuff ...
public class Customer implements Serializable {
   ...
}
public class CustomerEntityListener {
   @PostPersist
   public void customerPostPersist(Customer customer) {
      //Add functionalities
   }
}
 类似资料:
  • 问题内容: 我有针对特定软件包的此工作代码,但我想针对所有 controllers , service 和 dao 软件包进行配置 com.abc.xyz.content.controller com.abc.xyz.content.service com.abc.xyz.content.dao com.abc.xyz.category.controller com.abc.xyz.categor

  • 我想拦截所有java。sql。数据源。getConnection方法使用aspectj时,我使用了以下切入点: 它工作得很好。但我遇到了一些类,例如org。阿帕奇。公猫jdbc。水塘在该切入点不起作用的类层次结构中实现的数据源,其中数据源方法位于不实现数据源的层次结构中的类中,只有最顶层的类实现数据源: BaseDataSource不实现DataSource,但具有所有DataSource方法实现

  • add:如果我将方法存根添加到Fragment2中,就可以开始使用next annotation,但这是一个非常难看的解决方案 解决方案:多亏了@Kriegaex,我找到了解决方案:

  • 服务实现 但是,如果我将注释移动到公共接口方法实现,我的方面就会被触发。我应该如何定义我的切入点或配置我的方面来使我的原始用例工作?

  • 我想从类列表(可能属于不同的包)中记录所有方法的条目。注意,这些方法应该只属于指定的类。 我尝试了以下方法,但这些都不起作用 (1) 在这里使用if()切入点,我得到一个错误 (2) 使用切入点和aop的组合。xml在这里我得到一个错误 这里出了什么问题? 当然可以通过在切入点中单独指定每个类来实现,但这对于数百个类来说是不可扩展的。理想情况下,如果可以从外部文本文件中提取类列表(便于配置),那就

  • 我就是不明白为什么我的切入点不起作用。编译器并没有给出任何警告,所以我无法解释它为什么不工作。我正在maven javafx应用程序中使用aspectjrt 1.7.2和aspectjtools 1.7.0。 我的样子是这样的 我的电影方面位于包主要。模型 下面是对我的代码中实际发生的事情的一点解释 当我的gui加载时,我初始化MainFrame类。在此之前,另一个方面加载所有电影对象。然后,当主