This naming strategy helps mapstruct generate working mapping code between your domain classes and protobuf classes. Both fullblown Java protobuf and protolite classes suported.
Requires on mapstruct 1.4.0+.
Extends DefaultProtobufAccessorNamingStrategy
and provides necessary information to map all fields automatically
except
which require manual mapping.
Implements EnumMappingStrategy
and provides complete enum constant mappings if you follow Googles style guide for
enums https://developers.google.com/protocol-buffers/docs/style#enums
If needed you can specify a different postfix for the 0 value enum by passing in mapstructSpi.enumPostfixOverrides
as
a compilerArg in the format of:
-AmapstructSpi.enumPostfixOverrides=com.package.root.a=POSTFIX_1,com.package.root.b=POSTFIX_2
Otherwise, this will default to UNSPECIFIED
as per the Google style guide.
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<annotationProcessorPaths>
<path>
<groupId>no.entur.mapstruct.spi</groupId>
<artifactId>protobuf-spi-impl</artifactId>
<version>LATEST.VERSION</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-AmapstructSpi.enumPostfixOverrides=com.company.name=INVALID</arg>
</compilerArgs>
</configuration>
</plugin>
Standard mapping functions between often used proto types and java types:
See protobuf-support-standard and/or protobuf-support-lite folders for a ready-to-use mapstruct mapper.
NB: Make sure you add collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED
to your mapping interfaces
as protobuf stubs use the builder pattern.
@Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
public interface ... {
NB: Make sure you use the same version of mapstruct both in the annotation process and the general dependency.
mapstruct-spi-protobuf
generally depends on the latest released version of mapstruct.
Add the following section to you maven-compiler-plugin plugin configuration:
<annotationProcessorPaths>
<path>
<groupId>no.entur.mapstruct.spi</groupId>
<artifactId>protobuf-spi-impl</artifactId> <!-- Make sure mapstruct version here is the same as below -->
<version>LATEST.VERSION</version>
</path>
</annotationProcessorPaths>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
Complete example:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>no.entur.mapstruct.spi</groupId>
<artifactId>protobuf-spi-impl</artifactId>
<version>LATEST.VERSION</version>
</path>
</annotationProcessorPaths>
</configuration>
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
</dependencies>
</plugin>
Note: See Maven setup regarding using the same version of mapstruct both in the annotation processor and the general dependency.
implementation"org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor"org.mapstruct:mapstruct-processor:${mapstructVersion}"
annotationProcessor"no.entur.mapstruct.spi:protobuf-spi-impl:LATEST.VERSION"
http://mapstruct.org/documentation/stable/reference/html/index.html#using-spi