Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Apt Problem MapStruct - Eclipse with Java 17 Records #2628

Closed
blitzionian opened this issue Oct 26, 2021 · 12 comments
Closed

Apt Problem MapStruct - Eclipse with Java 17 Records #2628

blitzionian opened this issue Oct 26, 2021 · 12 comments

Comments

@blitzionian
Copy link

Using Mapstruct to map a simple record Record1 to a simple record Record2 in Eclipse throws APT Error.
If using maven directly, everything seems to work. So this seems to be a Problem of the combination of eclipse and mapstruct.
Not sure if iam try to using MapStruct in a way it doesn't support currently (or something else).

Example Project: https://github.com/blitzionian/mapstruct-eclipse-records
Java Version: 17
Eclipse Version: 2021-09 (4.21.0) Build id: 20210910-1417
Installed Plugins: Mapstruct, Java 17 Support, m2e-apt
JDK:

  • openjdk 17 2021-09-14
  • OpenJDK Runtime Environment (build 17+35-Ubuntu-120.04)
  • OpenJDK 64-Bit Server VM (build 17+35-Ubuntu-120.04, mixed mode, sharing)
Internal error in the mapping processor: java.lang.RuntimeException: Fallback implementation of asMemberOf didn't work for prop1 in org.example.Record2  at 
org.mapstruct.ap.internal.util.workarounds.SpecificCompilerWorkarounds.asMemberOf(SpecificCompilerWorkarounds.java:134)  	at org.mapstruct.ap.internal.util.workarounds.TypesDecorator.asMemberOf(TypesDecorator.java:135)  	at 
org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.getConstructorAccessor(BeanMappingMethod.java:606)  	at 
org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:214)  	at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:378)  	at
 org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:152)  	at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:123)  	at 
org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:74)  	at 
org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:338)  	at 
org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:318)  	at 
org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:267)  	at 
org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:166)  	at 
org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)  	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:950)  	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:377)  	at 
org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)  	at 
org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:309)  	at 
org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)  	at 
org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:272)  	at 
org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:187)  	at 
org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:853)  	at 
org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)  	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:232)  	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:281)  	at 
org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:334)  	at 
org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)  	at 
org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:337)  	at 
org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:389)  	at 
org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:410)  	at 
org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:160)  	at 
org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:251)  	at 
org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)  Caused by: java.lang.ClassCastException: class 
org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding cannot be cast to class 
org.eclipse.jdt.internal.compiler.lookup.FieldBinding (org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding and 
org.eclipse.jdt.internal.compiler.lookup.FieldBinding are in unnamed module of loader 
org.eclipse.osgi.internal.loader.EquinoxClassLoader @2b85322f)  	at 
org.eclipse.jdt.internal.compiler.apt.model.TypesImpl$3.find(TypesImpl.java:145)  	at 
org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.findMemberInHierarchy(TypesImpl.java:208)  	at 
org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:142)  	at 
org.mapstruct.ap.internal.util.workarounds.SpecificCompilerWorkarounds.asMemberOf(SpecificCompilerWorkarounds.java:120)
  	... 36 more  
@filiphr
Copy link
Member

filiphr commented Oct 31, 2021

Thanks for reporting this and providing an example project @blitzionian.

In 1.5.0.Beta1 we have done some changes in the area around Eclipse. Can you please try out your project with MapStruct 1.5.0.Beta1?

@blitzionian
Copy link
Author

@filiphr Have tried it with MapStruct 1.5.0.Beta1 in the example project. The APT Problem changed a little with the following stack trace:

Internal error in the mapping processor:
java.lang.ClassCastException: class org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding cannot be cast to
class org.eclipse.jdt.internal.compiler.lookup.FieldBinding (org.eclipse.jdt.internal.compiler.lookup.RecordComponentBinding and org.eclipse.jdt.internal.compiler.lookup.FieldBinding are in unnamed module of loader org.eclipse.osgi.internal.loader.EquinoxClassLoader @5eb054)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl$3.find(TypesImpl.java:145)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.findMemberInHierarchy(TypesImpl.java:208)
at org.eclipse.jdt.internal.compiler.apt.model.TypesImpl.asMemberOf(TypesImpl.java:142)
at org.mapstruct.ap.internal.util.AbstractTypeUtilsDecorator.asMemberOf(AbstractTypeUtilsDecorator.java:129)
at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.getConstructorAccessor(BeanMappingMethod.java:615)
at org.mapstruct.ap.internal.model.BeanMappingMethod$Builder.build(BeanMappingMethod.java:215)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:416)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:179)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:133)
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:81)
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:338)
at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:318)
at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:267)
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:166)
at org.eclipse.jdt.internal.compiler.apt.dispatch.RoundDispatcher.handleProcessor(RoundDispatcher.java:142)
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:950)
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:377)
at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.compile(BatchImageBuilder.java:214)
at org.eclipse.jdt.internal.core.builder.AbstractImageBuilder.compile(AbstractImageBuilder.java:309)
at org.eclipse.jdt.internal.core.builder.BatchImageBuilder.build(BatchImageBuilder.java:79)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.buildAll(JavaBuilder.java:272)
at org.eclipse.jdt.internal.core.builder.JavaBuilder.build(JavaBuilder.java:187)
at org.eclipse.core.internal.events.BuildManager$2.run(BuildManager.java:853)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:232)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:281)
at org.eclipse.core.internal.events.BuildManager$1.run(BuildManager.java:334)
at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)
at org.eclipse.core.internal.events.BuildManager.basicBuild(BuildManager.java:337)
at org.eclipse.core.internal.events.BuildManager.basicBuildLoop(BuildManager.java:389)
at org.eclipse.core.internal.events.BuildManager.build(BuildManager.java:410)
at org.eclipse.core.internal.events.AutoBuildJob.doBuild(AutoBuildJob.java:160)
at org.eclipse.core.internal.events.AutoBuildJob.run(AutoBuildJob.java:251)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:63)
RecordMapper.java /mapstruct-eclipse-records/src/main/java/org/example line 6 Annotation Problem (Java 6 processor)

@filiphr
Copy link
Member

filiphr commented Oct 31, 2021

Thanks for giving it a go @blitzionian. This is actually a bug in the Eclipse compiler itself. I have logged this bug with the eclipse JDT team. I'll wait and see what they do before we do something about it

@blitzionian
Copy link
Author

Thanks so far. Have pushed the example project with 1.5.0.Beta1.

@eiswind
Copy link

eiswind commented Mar 8, 2022

Are there any known workarounds? Nothing happened on the eclipse bug so far.

@blitzionian
Copy link
Author

I haven't looked for a workaround, just don't using this feature.

@dirweis
Copy link

dirweis commented Mar 16, 2022

@eiswind Yeah well... there is the "classic" workaround: You can delete the Error from the Problems view... until the file is edited again. But at least you should only see the real errors then.

@raouldh
Copy link

raouldh commented Jul 7, 2022

I have created a pull request for this bug at the eclipse.jdt project (eclipse-jdt/eclipse.jdt.core#199 ).
Hopefully it gets accepted, because keep using this work around became annoying.

@filiphr
Copy link
Member

filiphr commented Jul 8, 2022

That is great open source work @raouldh. Thanks for doing that work on the JDT plugin

@NetzwergX
Copy link

I hope the fix gets added to JDT in a timely manner. I'm having the exact same problem in VSCode, which uses JDT as well. The projects works well using maven, but not in VS Code due to the JDT error (I'm using mapstruct to map between Dtos, which are records, and JPA entities, which are lombok'ed).

Greatly appreciate the effort to fix JDT.

@raouldh
Copy link

raouldh commented Dec 23, 2022

My PR to fix this eventually got merged in the eclipse.jdt project. I just downloaded the latest eclipse version and can confirm that my errors related to this issue are now resolved.
Cheers!

@filiphr
Copy link
Member

filiphr commented Feb 5, 2023

That's great news @raouldh. Thanks a lot for your work on the fix for the eclipse.jdt project.

I am going to go ahead and close this issue now

@filiphr filiphr closed this as completed Feb 5, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

6 participants