Инфраструктура репозитория выдает StackruError в SDG 1.9.11.BUILD-SNAPSHOT при использовании постобработки запроса

При использовании нового QueryPostProcessor функция и переход на SDG 1.9.11.BUILD-SNAPSHOT от 1.9.10.RELEASE, StackruError выбрасывается во время инициализации контекста Spring...

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': Invocation of init method failed; nested exception is java.lang.StackruError
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1630)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:308)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
... 155 more



Caused by: java.lang.StackruError
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:465)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:490)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
at org.springframework.data.util.TypeDiscoverer.getSuperTypeInformation(TypeDiscoverer.java:490)
at org.springframework.data.util.ClassTypeInformation.getSuperTypeInformation(ClassTypeInformation.java:43)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:312)

1 ответ

Решение

Это довольно интересный результат (т.е. StackruError) и может быть ошибка / проблема с Spring Data Commons o.s.d.util.TypeDiscoverer; Я не уверен, и я еще не исследовал (больше на StackruError ниже).

В двух словах, SDG использует Spring Data (Commons) TypeDiscover класс для "проверки" всех bean-компонентов (определений), объявленных и зарегистрированных в контексте приложения Spring, и в качестве примера...

@Component
class MyUserRepositoryQueryPostProcessor 
  implements QueryPostProcessor<UserRepository, String> {
    ...
}

Реализация o.s.d.g.repository.query.QueryPostProcessor Интерфейс требует 2 бит информации: тип интерфейса, к которому QueryPostProcessor следует применить и тип запроса, который в случае SDG является java.lang.String поскольку OQL выражается как String В настоящее время (хотя это может измениться в будущем).

Вот один пример из набора тестов SDG.

Вопрос в том, как эффективно объявить и зарегистрировать интерфейс репозитория приложения. QueryPostProcessor как определение бина в контексте Spring?

В моем интеграционном тесте я "явно" зарегистрировал свой QueryPostProcessors как @Bean определения в весне @Configuration класс, в то время как вы в основном любите использовать компонентный поиск в Springpath, учитывая использование Spring @Component аннотация стереотипа, которая может быть проблематичной в определенных случаях.

Открытие QueryPostProcessors в SDG привязана к "фазе разбора" инфраструктуры репозитория. Контейнер Spring может не анализировать определения bean-компонентов (в зависимости от использования @Component аннотации) для вашего QueryPostProcessors, Обычно вы можете настроить порядок синтаксического анализа, перемещая определения bean-компонентов в вашей конфигурации, фактически для XML и JavaConfig, но, как правило, лучше явно указывать вашу конфигурацию.

Хотя сканирование компонентов classpath удобно, оно менее очевидно, если что-то пойдет не так с процессом сканирования, анализа и регистрации.

Мне нужно больше об этом подумать и провести несколько тестов.

Пока вы можете следить за тем, что я сделал в моем интеграционном тесте.

Надеюсь это поможет!

С уважением, Джон

Другие вопросы по тегам