0

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.

zee
  • 1

1 Answers1

0

That's because PersistenceAnnotationBeanPostProcessor requires runtime features like reflection and dynamic proxy generation. first, I'd try using the graalvm tracing agent, and if it doesn't help you can try replacing it with another BeanPostProcessor from spring native. look here for longer(and better) explanation.

Benaya Trabelsi
  • 351
  • 3
  • 11