@MapperConfig, @InheritConfiguration and java.lang.Object

743 views
Skip to first unread message

Remo Meier

unread,
Nov 15, 2016, 6:17:17 AM11/15/16
to mapstruct-users
Hi

I try to use @InheritConfiguration to ignore an attribute in multple mappers.

- Interface I with attribute someAttr
- Mapper for X => S
- Mapper for Y => U
- S and U implement I
- X and Y do not implement I and do not have someAttr

Now I would like to ignore A for both mappers with @InheritConfiguration and @MapperConfig. My mapper configuration looks like:

@MapperConfig
public interface IConfig {

@Mapping(target = "someAttr", ignore = true)
I map(Object anyDto);
}

With java.lang.Object as parameter to configure any mapper that maps to I. And my mapper looks like:

@Mapper(componentModel = "cdi", uses = { IConfig.class })
public interface XMapper {

@InheritConfiguration
S map(X dto);
}

Is that the right approach? Currently I'm getting:


 error: Internal error in the mapping processor: java.lang.NullPointerException  
        at org.mapstruct.ap.internal.model.source.MappingOptions.applyInheritedOptions(MappingOptions.java:166) 
        at org.mapstruct.ap.internal.processor.MapperCreationProcessor.mergeInheritedOptions(MapperCreationProcessor.java:413)  
        at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMappingMethods(MapperCreationProcessor.java:263)
  at org.mapstruct.ap.internal.processor.MapperCreationProcessor.getMapper(MapperCreationProcessor.java:146) 
  at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:117)  
at org.mapstruct.ap.internal.processor.MapperCreationProcessor.process(MapperCreationProcessor.java:76)  
at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:270)  
at org.mapstruct.ap.MappingProcessor.processMapperTypeElement(MappingProcessor.java:250)  
at org.mapstruct.ap.MappingProcessor.processMapperElements(MappingProcessor.java:216)
  at org.mapstruct.ap.MappingProcessor.process(MappingProcessor.java:155)  
at com.sun.tools.javac.processing.JavacProcessingEnvironment.callProcessor(JavacProcessingEnvironment.java:794) 
  at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:705)  
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
  at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035) 
  at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176) 
  at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)  
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)  
at com.sun.tools.javac.main.Main.compile(Main.java:523)  
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)  
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138) 
  at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:46)  
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:33)
  at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:104)  
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:53)  
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:38)  
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)  
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)  
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:189)  
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:170)  
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:113) 
  at sun.reflect.GeneratedMethodAccessor996.invoke(Unknown Source)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)  
at java.lang.reflect.Method.invoke(Method.java:497)  
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75) 
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:158) 
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:129) 
  at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:118)  
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)  
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)  
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
  at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)  
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)   at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)   at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)   at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)   at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)   at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)   at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:233)   at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)   at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:74)  
at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:55) 
  at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)  
at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40) 
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)   at java.lang.Thread.run(Thread.java:745)  

In real life it are dozens of such mappers and multiple attributes we would like to ignore once globally.

Thx, Regards
Remo

Andreas Gudian

unread,
Nov 15, 2016, 6:41:12 AM11/15/16
to Remo Meier, mapstruct-users
I think that should work.

The NPE is definitely a bug, so it would be great if you could also test it with the latest version 1.1.0-CR2 and open an issue in our GitHub project. Then we can check what's wrong there.

Thanks,
Andreas

--
You received this message because you are subscribed to the Google Groups "mapstruct-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to mapstruct-use...@googlegroups.com.
To post to this group, send email to mapstru...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Remo Meier

unread,
Nov 15, 2016, 7:49:10 AM11/15/16
to mapstruct-users
CR2 does not make a difference. I created https://github.com/mapstruct/mapstruct/issues/960.

Thx! Remo

Filip Hrisafov

unread,
Nov 15, 2016, 1:55:57 PM11/15/16
to mapstruct-users
Just to have an answer here as well.

The problem is that you are using @Mapping(uses = { IMapperConfig.class }) instead of @Mapping(config = IMapperConfig.class).

uses means other mapper types that need to be used by the mapper to create the mappings, whereas config is just a configuration which MapStruct will use to create the implementation.

Reply all
Reply to author
Forward
0 new messages