Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mapstruct - How can I inject a spring dependency in the Generated Mapper class

I need to inject a spring service class in the generated mapper implementation, so that I can use it via

   @Mapping(target="x", expression="java(myservice.findById(id))")" 

Is this applicable in Mapstruct-1.0?

like image 269
Karim Tawfik Avatar asked Aug 06 '16 18:08

Karim Tawfik


2 Answers

As commented by brettanomyces, the service won't be injected if it is not used in mapping operations other than expressions.

The only way I found to this is :

  • Transform my mapper interface into an abstract class
  • Inject the service in the abstract class
  • Make it protected so the "implementation" of the abstract class has access

I'm using CDI but it should be the samel with Spring :

@Mapper(         unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE,         componentModel = "spring",         uses = {             // My other mappers...         }) public abstract class MyMapper {      @Autowired     protected MyService myService;      @Mappings({         @Mapping(target="x", expression="java(myservice.findById(obj.getId())))")     })     public abstract Dto myMappingMethod(Object obj);  } 
like image 111
Bob Avatar answered Sep 21 '22 12:09

Bob


It should be possible if you declare Spring as the component model and add a reference to the type of myservice:

@Mapper(componentModel="spring", uses=MyService.class) public interface MyMapper { ... } 

That mechanism is meant for providing access to other mapping methods to be called by generated code, but you should be able to use them in the expression that way, too. Just make sure you use the correct name of the generated field with the service reference.

like image 26
Gunnar Avatar answered Sep 25 '22 12:09

Gunnar