spring-projects-experimental / spring-boot-migrator

Spring Boot Migrator (SBM) is a tool for automated code migrations to upgrade or migrate to Spring Boot
Apache License 2.0
428 stars 87 forks source link

Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" #601

Open marcgemis opened 1 year ago

marcgemis commented 1 year ago

Describe the bug Cannot generate a sbu30-report because the program reports a Applying recipe 'sbu30-report' Action [SpringBootUpgradeReportAction] 'Creates a Upgrade report for Spring Boot 3.' failed: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

To Reproduce

-then I tried to generate a report

api-gateway:> apply sbu30-report Applying recipe 'sbu30-report' Action [SpringBootUpgradeReportAction] 'Creates a Upgrade report for Spring Boot 3.' failed: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null Details of the error have been omitted. You can use the stacktrace command to print the full stacktrace.

Expected behavior The Spring Boot migration report should be generated

Stacktrace If applicable, add the (sanitized) stacktrace here.

api-gateway:> stacktrace org.springframework.sbm.engine.recipe.ActionFailedException: Action [SpringBootUpgradeReportAction] 'Creates a Upgrade report for Spring Boot 3.' failed: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null at org.springframework.sbm.engine.recipe.Action.applyWithStatusEvent(Action.java:43) at org.springframework.sbm.engine.recipe.Recipe.apply(Recipe.java:101) at org.springframework.sbm.engine.commands.ApplyCommand.execute(ApplyCommand.java:61) at org.springframework.sbm.shell.ApplyShellCommand.apply(ApplyShellCommand.java:61) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.shell.command.invocation.InvocableShellMethod.doInvoke(InvocableShellMethod.java:306) at org.springframework.shell.command.invocation.InvocableShellMethod.invoke(InvocableShellMethod.java:232) at org.springframework.shell.command.CommandExecution$DefaultCommandExecution.evaluate(CommandExecution.java:158) at org.springframework.shell.Shell.evaluate(Shell.java:208) at org.springframework.shell.Shell.run(Shell.java:140) at org.springframework.shell.jline.InteractiveShellRunner.run(InteractiveShellRunner.java:73) at org.springframework.shell.DefaultShellApplicationRunner.run(DefaultShellApplicationRunner.java:65) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:762) at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at org.springframework.sbm.SpringShellApplication.main(SpringShellApplication.java:27) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: java.lang.NullPointerException: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null at org.springframework.sbm.java.impl.OpenRewriteMethod.getReturnValue(OpenRewriteMethod.java:167) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.lambda$apply$1(SpringBeanMethodDeclarationFinder.java:52) at java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90) at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602) at java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129) at java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230) at java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.lambda$apply$2(SpringBeanMethodDeclarationFinder.java:52) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.lambda$apply$6(SpringBeanMethodDeclarationFinder.java:56) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.apply(SpringBeanMethodDeclarationFinder.java:45) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.apply(SpringBeanMethodDeclarationFinder.java:30) at org.springframework.sbm.engine.context.ProjectContext.search(ProjectContext.java:77) at org.springframework.sbm.boot.upgrade_27_30.report.helper.CommonsMultipartResolverHelper.evaluate(CommonsMultipartResolverHelper.java:51) at org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportSection.shouldRender(SpringBootUpgradeReportSection.java:77) at org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportAction.lambda$apply$0(SpringBootUpgradeReportAction.java:124) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportAction.apply(SpringBootUpgradeReportAction.java:125) at org.springframework.sbm.boot.upgrade_27_30.report.SpringBootUpgradeReportAction.applyInternal(SpringBootUpgradeReportAction.java:214) at org.springframework.sbm.engine.recipe.Action.applyWithStatusEvent(Action.java:37) ... 28 more

Desktop (please complete the following information):

Additional context

There was no problem to generate the report boot-2.7-3.0-upgrade-report

marcgemis commented 1 year ago

This problem did not occur in other projects, only on a project with api-gateway. Since I use Keycloak in one of my microservices, I cannot upgrade to Spring Boot 3.0 at the moment, so it is not urgent

fabapp2 commented 1 year ago

Hi @marcgemis Thanks for reporting and a Happy New Year 🚀

Could you try using spring-boot-upgrade.jar to see if the error persists? Looking at the stacktrace I am afraid it doesn't but since we moved the Boot Upgrade functionality to it's own application it could be that the functionality just didn't get enough love since then. 🤞

marcgemis commented 1 year ago

Hello @fabapp2 ,

best wishes to you as well,. I downloaded the spring-boot-upgrade.jar and tried it on the same api-gateway project. I get the same problem.

I ran it with java -Dsbm.gitSupportEnabled=false -Dserver.port=8432 --add-opens java.base/sun.nio.ch=ALL-UNNAMED --add-opens java.base/java.io=ALL-UNNAMED -jar spring-boot-upgrade.jar

after a bit of experimenting, as I could not find any documentation on running spring-boot-upgrade.jar

marcgemis commented 1 year ago

I've tried spring-boot-upgrade on some other projects we have and it fails on them as well. So far it works for a simple Eureka-server project and one microservice we have. We try to set up all our microservices in the same way. So it's hard to tell why it works for one of them and not for the others.

I just noticed the exception is slightly different for spring-boot-upgrade.jar

Scanning /Users/mgemis/Projects/p4/awp/bluecloud/microservices/jdf-service 07:52:28.055 [main] ERROR o.s.boot.SpringApplication - Application run failed java.lang.IllegalStateException: Failed to execute ApplicationRunner at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:765) at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:752) at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) at org.springframework.sbm.SpringBootUpgradeReportApp.main(SpringBootUpgradeReportApp.java:31) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) at org.springframework.boot.loader.Launcher.launch(Launcher.java:108) at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) Caused by: org.springframework.sbm.engine.recipe.ActionFailedException: Action [SpringBootUpgradeReportAction] 'Creates a Upgrade report for Spring Boot 3.' failed: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null at org.springframework.sbm.engine.recipe.Action.applyWithStatusEvent(Action.java:43) at org.springframework.sbm.engine.recipe.Recipe.apply(Recipe.java:101) at org.springframework.sbm.engine.commands.ApplyCommand.execute(ApplyCommand.java:61) at org.springframework.sbm.SpringBootMigratorRunner.run(SpringBootMigratorRunner.java:46) at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:762) ... 13 common frames omitted Caused by: java.lang.NullPointerException: Cannot invoke "org.openrewrite.java.tree.JavaType$FullyQualified.getFullyQualifiedName()" because the return value of "org.openrewrite.java.tree.TypeUtils.asFullyQualified(org.openrewrite.java.tree.JavaType)" is null at org.springframework.sbm.java.impl.OpenRewriteMethod.getReturnValue(OpenRewriteMethod.java:167) at org.springframework.sbm.boot.common.finder.SpringBeanMethodDeclarationFinder.lambda$apply$1(SpringBeanMethodDeclarationFinder.java:52)

but that is to be expected I assume

marcgemis commented 1 year ago

I started with a fresh project, and found that when I add this stripped down version of my SecurityConfig to the project, the error occurs

package com.example.demo;

import java.util.Collection;

import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.ResolvableType; import org.springframework.core.convert.converter.Converter; import org.springframework.security.config.web.server.ServerHttpSecurity; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper; import org.springframework.security.oauth2.client.oidc.web.server.logout.OidcClientInitiatedServerLogoutSuccessHandler; import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.web.server.SecurityWebFilterChain; import org.springframework.security.web.server.header.XFrameOptionsServerHttpHeadersWriter.Mode;

import lombok.RequiredArgsConstructor;

@Configuration @RequiredArgsConstructor public class SecurityConfig {

private final ApplicationContext context;

private <T> T getBeanOrNull(Class<T> beanClass) {
return getBeanOrNull(ResolvableType.forClass(beanClass));
}

@SuppressWarnings("unchecked")
private <T> T getBeanOrNull(ResolvableType type) {
if (this.context == null) {
    return null;
}
String[] names = this.context.getBeanNamesForType(type);
if (names.length == 1) {
    return (T) this.context.getBean(names[0]);
}
return null;
}

}

I don't know why the method was added. We do not need it anymore. However, the exact same code is not in any of the other projects that fail.

fabapp2 commented 1 year ago

Thanks a lot for isolating the issue, that's very helpful. I hope it will give me an idea of why it goes kaboom. Also planning to upgrade to the latest OpenRewrite before. I will then look into your issue (🤞) today and update the console output of spring-boot-upgrade.jar as well as the README thanks for pointing this out.

marcgemis commented 1 year ago

Please note that I also reported on issue against OpenRewrite : https://github.com/openrewrite/rewrite/issues/2547 I had some problems with the Jakarta rewrite scripts.