Инфраструктура репозитория выдает 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 удобно, оно менее очевидно, если что-то пойдет не так с процессом сканирования, анализа и регистрации.
Мне нужно больше об этом подумать и провести несколько тестов.
Пока вы можете следить за тем, что я сделал в моем интеграционном тесте.
Надеюсь это поможет!
С уважением, Джон