为什么我的界面上的自定义注释无法通过反射获得

时间:2019-05-14 10:54:34

标签: java spring-boot annotations

我正在使用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()返回一个空数组。

有人能给我解决方案或解释的原因吗?

0 个答案:

没有答案