Spring Data: получение объекта Target Class и пользовательского типа интерфейса для bean-компонента Spring - PullRequest
0 голосов
/ 20 июня 2019

У меня есть приложение, которое работает с:

  • Spring Framework
  • Spring Data JPA

Для тестирования через JUnit 5 у меня есть следующее:

@Autowired
private GodRepository godRepository;

....

@Test
void classTest() {
    logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godRepository));
    logger.info("Target expepcted Type Class: {}", GodRepositoryDataJpaAdapter.class);
    assertThat(AopUtils.getTargetClass(godRepository)).isNotNull()
                                                      .isEqualTo(GodRepositoryDataJpaAdapter.class);
}

Работает и проходит. Здесь GodRepositoryDataJpaAdapter реализует GodRepository.

Цель : подтвердить, что @Autowired действительно вводил тип класса GodRepositoryDataJpaAdapter во время выполнения, через GodRepository тип

Пока здесь все в порядке и примерно явно для Spring Framework

Теперь о Spring Data

Существует определено следующее пользовательский interface:

public interface GodRepositoryDataJpa extends CrudRepository<God, String> {

}

снова для тестирования

@Autowired
private CrudRepository<God, String> godCrudRepository;

...

@Test
void classTest() {
    logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godCrudRepository));
    logger.info("Target (AOP) Class: {}", AopUtils.getTargetClass(godCrudRepository).getSuperclass());
    logger.info("Target expepcted Type Class: {}", GodRepositoryDataJpa.class);
}

Он печатает:

Target (AOP) Class: class org.springframework.data.jpa.repository.support.SimpleJpaRepository 
Target (AOP) Class: class java.lang.Object 
Target expepcted Type Class: interface com.manuel.jordan.repository.data.jpa.GodRepositoryDataJpa 

Обратите внимание, что для первой строки было напечатано SimpleJpaRepository, это класс, сгенерированный за сценой с помощью Spring Data

Запрос : как, если возможно, получить во время выполнения тип GodRepositoryDataJpa (мой пользовательский interface), чтобы выполнить утверждение позже без каких-либо проблем

Примечание : если я попытаюсь:

logger.info("Target (AOP) Class: {}", Arrays.asList(AopUtils.getTargetClass(godCrudRepository).getAnnotatedInterfaces()));
logger.info("Target (AOP) Class: {}", Arrays.asList(AopUtils.getTargetClass(godCrudRepository).getAnnotatedSuperclass()));

Я получил:

Target (AOP) Class: [sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedParameterizedTypeImpl@77a0dd63] 
Target (AOP) Class: [sun.reflect.annotation.AnnotatedTypeFactory$AnnotatedTypeBaseImpl@543fe698]
...