I’m working on a migration recipe using OpenRewrite to transform Play Framework controllers into Spring Boot REST controllers. However, I’m encountering the following error when running my test, given the ok() is a static method in play.mvc.Results class.
java.lang.IllegalStateException: LST contains missing or invalid type information
MethodInvocation->Return->Block->MethodDeclaration->Block->ClassDeclaration->CompilationUnit
/*~~(MethodInvocation type is missing or malformed)~~>*/ok("Hello")
at org.openrewrite.java.Assertions.assertValidTypes(Assertions.java:87)
at org.openrewrite.java.Assertions.validateTypes(Assertions.java:57)
at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:305)
at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:133)
at org.openrewrite.test.RewriteTest.rewriteRun(RewriteTest.java:128)
at com.yourorg.PlayToSpringControllerMigrationTest.migratePlayControllerWithIndexMethod(PlayToSpringControllerMigrationTest.java:92)
at java.base/java.lang.reflect.Method.invoke(Method.java:569)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
Here is the test method:
class PlayToSpringControllerMigrationTest implements RewriteTest {
@Override
public void defaults(RecipeSpec spec) {
spec.recipe(new MigratePlayToSpringControllersRecipe())
.parser(JavaParser.fromJavaVersion().classpathFromResources(new InMemoryExecutionContext(),
"jackson-databind", "jackson-core","jackson-annotations",
"spring-web-6.+.+", "play_2.11-2.7.+"));
}
@Test
void migratePlayControllerWithIndexMethod() {
rewriteRun(
Assertions.java(
"""
package com.example;
import play.mvc.*;
public class HomeController extends Controller {
public Result index() {
return ok("Hello");
}
}
""",
"""
package com.example;
import play.mvc.*;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HomeController {
public Result index() {
return Results.ok("Hello");
}
}
"""
)
);
}
}
And here is the code for the getVisitor
method:
@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
return Preconditions.check(precondition(), new JavaIsoVisitor<ExecutionContext>() {
@Override
public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext executionContext) {
System.out.println("visitClassDeclarationn" + TreeVisitingPrinter.printTree(getCursor()));
J.ClassDeclaration cd = super.visitClassDeclaration(classDecl, executionContext);
// Check if the class extends the given class
if (cd.getExtends() != null) {
assert classDecl.getType() != null;
if (TypeUtils.isOfClassType(cd.getExtends().getType(), "play.mvc.Controller")) {
// Remove the superclass
cd = cd.withExtends(null);
updateCursor(cd);
// Update the class type to remove superclass
JavaType.Class type = (JavaType.Class) cd.getType();
if (type != null) {
cd = cd.withType(type.withSupertype(null));
updateCursor(cd);
}
// Add the new interface
cd = JavaTemplate.builder("@RestController")
.imports("org.springframework.web.bind.annotation.RestController")
.javaParser(JavaParser.fromJavaVersion().classpathFromResources(executionContext, "spring-web-6.+.+", "play_2.11-2.7.+"))
.build()
.apply(getCursor(),
cd.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName)));
// Optionally, remove old imports and add new imports
maybeAddImport("org.springframework.web.bind.annotation.RestController");
maybeRemoveImport("play.mvc.Controller");
}
}
return cd;
}
});
}
Was Expecting test to pass!!
New contributor
Azar is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.