java - 为什么我在接口上的自定义注释无法通过反射获得
问题描述
我正在使用 Spring Data 在 Spring Boot 应用程序中访问 Mongo 数据库。我通过扩展 MongoRepository 来做到这一点。
@CrudPublishingRepository
public interface ProfileRepository extends MongoRepository<Profile, String> {
Optional<Profile> findByUserName(String userName);
@Query("{'products.contracts.contractId': ?0}")
List<Profile> findByContractId(String contractId);
}
对于我的一些存储库(包括上面的 ProfileRepository),每次执行保存或删除操作时,我都需要执行一些操作,这就是我创建 @CrudPublishingRepository 注释的原因。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface CrudPublishingRepository {}
我使用 Spring AOP 拦截 Spring 的 CrudRepository 上的所有保存和删除方法,并提供以下建议:
@AfterReturning("execution(public * delete(..)) && this(org.springframework.data.repository.CrudRepository)")
public void onDeleteExecuted(JoinPoint pjp) {
onDelete(pjp);
}
@AfterReturning("execution(public * deleteById(..)) && this(org.springframework.data.repository.CrudRepository)")
public void onDeleteByIdExecuted(JoinPoint pjp) {
onDeleteById(pjp);
}
@AfterReturning("execution(public * deleteAll(..)) && this(org.springframework.data.repository.CrudRepository)")
public void onDeleteAllExecuted(JoinPoint pjp) {
onDeleteAll(pjp);
}
@Around(value = "execution(public * save(..)) && this(org.springframework.data.repository.CrudRepository)")
public Object onSaveExecuted(ProceedingJoinPoint pjp) throws Throwable {
return onSave(pjp);
}
onSave 方法如下所示:
private Object onSave(ProceedingJoinPoint pjp) throws Throwable {
System.out.println(getTopicName(pjp));
try {
Object result = pjp.proceed();
return result;
} catch (Throwable t) {
throw t;
}
}
最后是 getTopicName(JoinPoint pjp) 函数,这就是问题所在:
private Optional<String> getTopicName(JoinPoint pjp) {
Class clazz = pjp.getTarget().getClass();
while (clazz != null) {
for (Class i : pjp.getTarget().getClass().getInterfaces()) {
if (i.getAnnotation(CrudPublishingRepository.class) != null) {
return Optional.of("found it!");
}
}
clazz = clazz.getSuperclass();
}
return Optional.empty();
}
实现显然还没有完成,但我希望它返回 Optional.of("found it!"),但事实并非如此。
当我调试时,我可以看到 ProfileRepository 是接口之一,正如预期的那样,但 getAnnotations() 返回一个空数组。
谁能给我一个解决方案或解释为什么这不起作用?
解决方案
推荐阅读
- tokenize - 为什么当特殊字符可用时 ElasticSearch 无法搜索?
- c# - 无法对来自 .NET Core 的 SharePoint REST 或 CSOM 调用进行身份验证
- azure - 发布到 Azure 服务结构群集时出错
- java - Apache Camel,Netty4 端点作为客户端 - 内存泄漏
- android - Android Studio 中 XML 布局的意外自动格式化
- go - 当客户端重新连接到我的 TCP 服务器时,内存不断增加
- sql - tsql rowcount 不执行更新
- c# - 拆分我的 xUnit 测试以测试扩展方法的最佳方法
- repo - 使用 android repo 工具获取当前活动的分支
- angular - WebRTC 中的带宽计算