During the development of a new Java recipe I faced the following exception.
Error while visiting lib/persistence/src/main/java/com/mycompany/persistence/entity/StudyLog.java: java.lang.IllegalStateException: Unable to construct Java21Parser.
org.openrewrite.java.Java21Parser$Builder.build(Java21Parser.java:96)
org.openrewrite.java.Java21Parser$Builder.build(Java21Parser.java:63)
org.openrewrite.java.internal.template.JavaTemplateParser.compileTemplate(JavaTemplateParser.java:273)
org.openrewrite.java.internal.template.JavaTemplateParser.lambda$parseAnnotations$10(JavaTemplateParser.java:234)
org.openrewrite.java.internal.template.JavaTemplateParser.cache(JavaTemplateParser.java:337)
org.openrewrite.java.internal.template.JavaTemplateParser.parseAnnotations(JavaTemplateParser.java:231)
org.openrewrite.java.internal.template.JavaTemplateJavaExtension$1.visitAnnotation(JavaTemplateJavaExtension.java:72)
org.openrewrite.java.internal.template.JavaTemplateJavaExtension$1.visitAnnotation(JavaTemplateJavaExtension.java:60)
org.openrewrite.java.tree.J$Annotation.acceptJava(J.java:229)
org.openrewrite.java.tree.J.accept(J.java:55)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:242)
org.openrewrite.TreeVisitor.visit(TreeVisitor.java:154)
org.openrewrite.java.JavaTemplate.doApply(JavaTemplate.java:129)
org.openrewrite.java.JavaTemplate.apply(JavaTemplate.java:109)
com.mycompany.GenericGeneratorToSequenceGenerator$1.visitAnnotation(GenericGeneratorToSequenceGenerator.java:73)
com.mycompany.GenericGeneratorToSequenceGenerator$1.visitAnnotation(GenericGeneratorToSequenceGenerator.java:38)
This is the method that raised the exception
@Override
public J.Annotation visitAnnotation(J.Annotation annotation, ExecutionContext ctx) {
J.Annotation ann = super.visitAnnotation(annotation, ctx);
if (!isGenericGenerator(ann) || ann.getArguments() == null) {
return ann;
}
String name = null;
String sequenceName = null;
for (Expression arg : ann.getArguments()) {
if (!(arg instanceof J.Assignment assignment)) continue;
String key = ((J.Identifier) assignment.getVariable()).getSimpleName();
if ("name".equals(key)) {
name = extractStringLiteral(assignment.getAssignment());
} else if ("parameters".equals(key)) {
sequenceName = extractSequenceNameFromParameters(assignment.getAssignment());
}
}
if (name == null || sequenceName == null) {
return ann;
}
maybeRemoveImport(GENERIC_GENERATOR);
maybeRemoveImport(PARAMETER);
maybeAddImport(SEQUENCE_GENERATOR);
return JavaTemplate
.builder("@SequenceGenerator(name = \"" + name + "\", sequenceName = \"" + sequenceName + "\")")
.imports(SEQUENCE_GENERATOR)
.javaParser(JavaParser.fromJavaVersion().classpath("jakarta.jakartaee-api"))
.build()
.apply(getCursor(), ann.getCoordinates().replace());
}
The error occurred because I wasn't providing a the full classpath. As soon as updated the line .javaParser(JavaParser.fromJavaVersion().classpath("jakarta.jakartaee-api", "hibernate-core")) and add the dependency to the Maven rewrite plugin.
My ask here is to improve the Java21Parser message to quick pin point the missing classpath.
@timtebeek and I were discussing this here https://rewriteoss.slack.com/archives/C01A843MWG5/p1775932731154979
During the development of a new Java recipe I faced the following exception.
This is the method that raised the exception
The error occurred because I wasn't providing a the full classpath. As soon as updated the line
.javaParser(JavaParser.fromJavaVersion().classpath("jakarta.jakartaee-api", "hibernate-core"))and add the dependency to the Maven rewrite plugin.My ask here is to improve the Java21Parser message to quick pin point the missing classpath.
@timtebeek and I were discussing this here https://rewriteoss.slack.com/archives/C01A843MWG5/p1775932731154979