Spring-native(Spring-boot3.0.5):Override calss ClassPathBeanDefinitionScanner run error when use AOT
Spring-boot version:3.0.5
I define a new class extende ClassPathBeanDefinitionScanner:
lang=java
public class RpcComponentScanner extends ClassPathBeanDefinitionScanner {
public RpcComponentScanner(BeanDefinitionRegistry registry) {
super(registry);
}
public void registerDefaultFilters() {
this.addIncludeFilter(new AnnotationTypeFilter(MyRPCService.class));
}
public Set<BeanDefinitionHolder> doScan(String... basePackages) {
Set<BeanDefinitionHolder> beanDefinitions = super.doScan(basePackages);
return beanDefinitions;
}
// ....... other codes
}
and implements BeanFactoryPostProcessor,this class will invode RpcComponentScanner.scan() when spring application startup.
@Component
public class RpcComponentProcesser implements BeanFactoryPostProcessor, BeanPostProcessor, ApplicationContextAware {
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
String basePackage ="com.demo";// value is "com.demo"
if (!(beanFactory instanceof BeanDefinitionRegistry)){
return;
}
RpcComponentScanner scanner = new RpcComponentScanner((BeanDefinitionRegistry) beanFactory);
scanner.setResourceLoader(applicationContext);
scanner.scan(RpcConstants.COMMA_SPLIT_PATTERN.split(basePackage));// This line runs success in JVM,but failed in AOT.The code compile successful with graalvm,but startup with exceptions
}
// ....... other codes
}
I have registerd RpcComponentProcesser and RpcComponentScanner,MyRPCService in RuntimeHints class which implements RuntimeHintsRegistrar.
The detail exception log is:
java.lang.IllegalStateException: Cannot load optional framework class: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:206) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:138) ~[na:na]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:258) ~[nbs-bootstrap.exe:6.0.7]
at com.tplink.ignite.rpc.processer.RpcComponentProcesser.postProcessBeanFactory(RpcComponentProcesser.java:61) ~[nbs-bootstrap.exe:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:358) ~[na:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:201) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:747) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[nbs-bootstrap.exe:3.0.5]
at com.tplink.ignite.platform.cms.CmsApplication.main(CmsApplication.java:48) ~[nbs-bootstrap.exe:na]
Caused by: java.lang.ClassNotFoundException: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at java.base@17.0.6/java.lang.Class.forName(DynamicHub.java:1132) ~[nbs-bootstrap.exe:na]
at org.springframework.util.ClassUtils.forName(ClassUtils.java:283) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:202) ~[na:na]
... 14 common frames omitted
16:37:41.885 [main] INFO c.t.i.p.c.bootstrap.SpringTrigger - ......... server start error.........
java.lang.IllegalStateException: Cannot load optional framework class: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:206) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:138) ~[na:na]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:258) ~[nbs-bootstrap.exe:6.0.7]
at com.tplink.ignite.rpc.processer.RpcComponentProcesser.postProcessBeanFactory(RpcComponentProcesser.java:61) ~[nbs-bootstrap.exe:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:358) ~[na:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:201) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:747) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[nbs-bootstrap.exe:3.0.5]
at com.tplink.ignite.platform.cms.CmsApplication.main(CmsApplication.java:48) ~[nbs-bootstrap.exe:na]
Caused by: java.lang.ClassNotFoundException: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at java.base@17.0.6/java.lang.Class.forName(DynamicHub.java:1132) ~[nbs-bootstrap.exe:na]
at org.springframework.util.ClassUtils.forName(ClassUtils.java:283) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:202) ~[na:na]
... 14 common frames omitted
16:37:41.895 [main] ERROR o.s.boot.SpringApplication - Application run failed
java.lang.IllegalStateException: Cannot load optional framework class: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:206) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:138) ~[na:na]
at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.scan(ClassPathBeanDefinitionScanner.java:258) ~[nbs-bootstrap.exe:6.0.7]
at com.tplink.ignite.rpc.processer.RpcComponentProcesser.postProcessBeanFactory(RpcComponentProcesser.java:61) ~[nbs-bootstrap.exe:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:358) ~[na:na]
at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:201) ~[na:na]
at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:747) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:565) ~[nbs-bootstrap.exe:6.0.7]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:434) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:310) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1304) ~[nbs-bootstrap.exe:3.0.5]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1293) ~[nbs-bootstrap.exe:3.0.5]
at com.tplink.ignite.platform.cms.CmsApplication.main(CmsApplication.java:48) ~[nbs-bootstrap.exe:na]
Caused by: java.lang.ClassNotFoundException: org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor
at java.base@17.0.6/java.lang.Class.forName(DynamicHub.java:1132) ~[nbs-bootstrap.exe:na]
at org.springframework.util.ClassUtils.forName(ClassUtils.java:283) ~[na:na]
at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:202) ~[na:na]
... 14 common frames omitted
Can anyone help me? Thanks!
when I remove the line:
scanner.scan(RpcConstants.COMMA_SPLIT_PATTERN.split(basePackage));
The application run successful.