gpt4 book ai didi

spring - Spring CrudRepository 中方法的 AspectJ 切入点

转载 作者:行者123 更新时间:2023-12-05 04:11:49 25 4
gpt4 key购买 nike

我使用 Spring 的 CrudRepository 结合注解 @RepositoryRestResource 来实现一个简单的 CRUD 应用程序,它可以通过 RESTful API 使用。我现在想在我的存储库上添加一个AspectJ 切入点,以便在调用接口(interface)中的 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 接口(interface),因为 Spring 在后面奇迹般地完成了这项工作。这是扩展 Springs 的 CrudRepository 的关键优势之一。

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

到目前为止我尝试过的是:

@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()。因此,我认为我的代码总体上是正确的。

我知道不能在接口(interface)上设置切入点。但是由于我不必自己实现接口(interface) CustomerRestRepository 来让事情正常进行,我需要找到一种方法来在接口(interface)的方法上设置切入点 - 或者找到一些其他解决方案。

嗯,一个可能的解决方案是实现接口(interface) CustomerRestRepository。但是我必须自己完成存储库的所有实现工作,并跳过使用 Spring 的 CrudRepository 的优势。

因此,我的问题是,是否可以在 Spring CrudRepository 中的方法上设置 AspectJ 切入点。

非常感谢您的所有回答。

最佳答案

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

有时候,事情没有想象的那么复杂。在 Spring 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 等提供注解 - visit this site for more information .

关于spring - Spring CrudRepository 中方法的 AspectJ 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41922236/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com