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);
}