mapstruct-spring-extensions icon indicating copy to clipboard operation
mapstruct-spring-extensions copied to clipboard

Error when compiling with Eclipse

Open Chessray opened this issue 3 years ago • 13 comments

    With following environment  `compiler: Eclipse JDT (IDE) 1.4.200.v20220802-0458, environment: Java 17.0.4.1 (Eclipse Adoptium)`, adapter class will NOT be generating method for all of the converters, but it only generate the class.
[Error - 4:53:17 AM] Sep 30, 2022, 4:53:17 AM Exception thrown by Java annotation processor org.mapstruct.extensions.spring.converter.ConverterMapperProcessor@67b39ba
java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl cannot be cast to class javax.lang.model.element.AnnotationMirror (org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @6f270916; javax.lang.model.element.AnnotationMirror is in module java.compiler of loader 'platform')
java.lang.Exception: java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl cannot be cast to class javax.lang.model.element.AnnotationMirror (org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @6f270916; javax.lang.model.element.AnnotationMirror is in module java.compiler of loader 'platform')
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:172)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:172)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:138)
	at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:953)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:450)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:426)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:379)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:311)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:273)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:188)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1024)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:254)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:311)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:400)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:403)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:514)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:462)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:544)
	at org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:524)
	at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:420)
	at org.eclipse.jdt.ls.core.internal.handlers.BuildWorkspaceHandler.buildProjects(BuildWorkspaceHandler.java:112)
	at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.lambda$28(JDTLanguageServer.java:885)
	at org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer.lambda$55(JDTLanguageServer.java:1070)
	at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(Unknown Source)
	at java.base/java.util.concurrent.CompletableFuture$Completion.exec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
	at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl cannot be cast to class javax.lang.model.element.AnnotationMirror (org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @6f270916; javax.lang.model.element.AnnotationMirror is in module java.compiler of loader 'platform')
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.toSourceTargetTypeNamePairs(ConverterMapperProcessor.java:104)
	at java.base/java.util.Optional.map(Unknown Source)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.getExternalConversionMappings(ConverterMapperProcessor.java:95)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.buildDescriptor(ConverterMapperProcessor.java:77)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.process(ConverterMapperProcessor.java:63)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
	... 34 more

Originally posted by @myatmin in https://github.com/mapstruct/mapstruct-spring-extensions/issues/53#issuecomment-1263110178

Chessray avatar Oct 01 '22 07:10 Chessray

Hello @myatmin,

Could you please provide a minimum example project for this behaviour - including the Eclipse project files?

Chessray avatar Oct 01 '22 07:10 Chessray

Closed as no reaction in nearly a year.

Chessray avatar Aug 09 '23 17:08 Chessray

Hi @Chessray,

Please accept my sincerest apologies. I missed out this issue notification.

I only have VSCode devcontainer sample project. mapstruct-example.zip

Can you just copy java files from the following package com.mapstruct.example.mapstructexample.mapper to your blank Eclipse project and see whether it generate all of the classes like adapter class and converter class?

myatmin avatar Nov 02 '23 11:11 myatmin

Hi @Chessray ,

I managed to open the sample project in Eclipse. Following error message is still encountered. Exception thrown by Java annotation processor org.mapstruct.extensions.spring.converter.ConverterMapperProcessor@7ea584e6

java.lang.Exception: java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl cannot be cast to class javax.lang.model.element.AnnotationMirror (org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @183f9933; javax.lang.model.element.AnnotationMirror is in module java.compiler of loader 'platform')
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:172)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.round(RoundDispatcher.java:124)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.BaseAnnotationProcessorManager.processAnnotations(BaseAnnotationProcessorManager.java:172)
	at org.eclipse.jdt.internal.apt.pluggable.core.dispatch.IdeAnnotationProcessorManager.processAnnotations(IdeAnnotationProcessorManager.java:138)
	at org.eclipse.jdt.internal.compiler.Compiler.processAnnotations(Compiler.java:953)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:450)
	at org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:426)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:406)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)
	at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:338)
	at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:273)
	at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:188)
	at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:1079)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:296)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:352)
	at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:441)
	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
	at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:444)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:555)
	at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:503)
	at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:585)
	at org.eclipse.core.internal.resources.Workspace.buildInternal(Workspace.java:594)
	at org.eclipse.core.internal.resources.Workspace.build(Workspace.java:490)
	at org.eclipse.ui.actions.BuildAction$1.runInWorkspace(BuildAction.java:291)
	at org.eclipse.core.internal.resources.InternalWorkspaceJob.run(InternalWorkspaceJob.java:43)
	at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
Caused by: java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl cannot be cast to class javax.lang.model.element.AnnotationMirror (org.eclipse.jdt.internal.compiler.apt.model.AnnotationValueImpl is in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @183f9933; javax.lang.model.element.AnnotationMirror is in module java.compiler of loader 'platform')
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
	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.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
	at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.toFromToMappings(ConverterMapperProcessor.java:160)
	at java.base/java.util.Optional.map(Optional.java:260)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.getExternalConversionMappings(ConverterMapperProcessor.java:152)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.buildAdapterDescriptor(ConverterMapperProcessor.java:137)
	at org.mapstruct.extensions.spring.converter.ConverterMapperProcessor.process(ConverterMapperProcessor.java:101)
	at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
	... 27 more

myatmin avatar Nov 06 '23 04:11 myatmin

Your project setup is wrong. You've configured the processors as regular Maven dependencies instead of annotation processing additions. Check https://mapstruct.org/documentation/stable/reference/html/#_apache_maven and https://mapstruct.org/documentation/spring-extensions/reference/html/#_apache_maven

Chessray avatar Nov 07 '23 12:11 Chessray

Hi @Chessray ,

Yes, I edited to correct one when I opened it in Eclipse. Here is the sample project. mapstruct-example.zip

It's having issue with ECJ but working fine with Javac. (Tried with IntelliJ) VSCode Java and Eclipse use ECJ and having problem with @ExternalConversion.

myatmin avatar Nov 08 '23 07:11 myatmin

Judging from the linked thread, this issue has to be fixed inside ECJ; therefore I'll close this one.

Chessray avatar Feb 12 '24 13:02 Chessray

Hi @Chessray,

After ECJ team checking of the above mentioned issue, actually ECJ followed the implementation correctly. Detail explanation can be found in this comment. Hibernate metamodel generator also corrected their generation issue too. See the issue link in this comment.

myatmin avatar Jun 06 '24 04:06 myatmin

So the workaround is to use Hibernate from the 6.2 series, or the (probably fixed) 6.5.3.Final release, which should have the fix included. The complete 6.3 and 6.4 series have that bug present.

fhackenberger avatar Jan 09 '25 15:01 fhackenberger

I am reading this one now @Chessray. Is this still a problem? Is there some exception that is happening? We do have the deferredMappers in the MappingProcessor in core. Those are filled when a mapper or some other class is using something that is not yet created, e.g. by another annotation processor.

filiphr avatar Jan 18 '25 12:01 filiphr

No, the issue is that we're performing an unsafe cast in our processor. ECJ uses a different implementation from Javac where the cast works. We have to fix this on our end.

Chessray avatar Jan 20 '25 11:01 Chessray

Got it, where exactly are we doing this unsafe cast? Maybe I can look into it?

filiphr avatar Jan 20 '25 13:01 filiphr

The ECJ team explain the error quite well here: https://github.com/eclipse-jdt/eclipse.jdt.core/issues/1676#issuecomment-2122056637.

So far, I've been struggling with time and not even managed to configure a proper test to reproduce the issue.

Chessray avatar Jan 22 '25 00:01 Chessray