Skip to content

Improve exception feedback when "Unable to construct Java21Parser" #7360

@tmoreira2020

Description

@tmoreira2020

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

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type

Projects

Status

Done

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions