What is MapStruct?
According to MapStruct website:MapStruct is a code generator that greatly simplifies the implementation of mappings between Java bean types based on a convention over configuration approach. The generated mapping code uses plain method invocations and thus is fast, type-safe and easy to understand.
Inject MapStruct mapper in Blueprint OSGi
Such mappings are sometimes necessary in our integration projects. We also use OSGi to create our applications and Blueprint for dependency injection. Blueprin Maven Plugin makes it very easy to use, providing annotation support.MapStruct supports component models like
cdi
, spring
and jsr330
, so generated classes could be used as beans. Fortunately, Blueprint Maven Plugin uses annotations from JSR 330, such as Singleton
or Named
.The only thing we have to do is to add property
componentModel
with value jsr330
to a mapping interface:@Mapper(componentModel = "jsr330") public interface PersonMapper { Person toDomain(PersonDto personDto); }and now we can inject
PersonMapper
to our beans:@Singleton @AllArgsConstructor public class CreatePersonHandler { private final PersonRepository personRepository; private final PersonMapper personMapper; // ... }Blueprint Maven Plugin will generate an
XML
file with bean PersonMapperImpl
and inject it to CreatePersonHandler
:<?xml version="1.0" encoding="UTF-8"?><blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"> <bean id="createPersonHandler" class="com.github.alien11689.osgi.mapstructblueprint.CreatePersonHandler"> <argument ref="personRepository"/> <argument ref="personMapperImpl"/> </bean> <bean id="personMapperImpl" class="com.github.alien11689.osgi.mapstructblueprint.PersonMapperImpl"/> <bean id="personRepository" class="com.github.alien11689.osgi.mapstructblueprint.PersonRepository"/> </blueprint>
Generate all mappers with JSR 330 annotations
If you have multiple mappers and all of them should be beans, then you can simply add one compiler argument in configuration and all the mappers will have@Singleton
and @Named
annotations by default.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ... <build> <plugins> ... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>${maven-compiler-plugin.version}</version> <configuration> <source>1.8</source> <target>1.8</target> <compilerArgs> <compilerArg> -Amapstruct.defaultComponentModel=jsr330 </compilerArg> </compilerArgs> </configuration> </plugin> ... </plugins> </build> </project>