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*
- oneof
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:
- Timestamp <-> Instant
- Duration <-> Duration
- Date <-> LocalDate
- TimeOfDay <-> LocalTime
- byte[] <-> ByteString
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"
https://mapstruct.org/documentation/stable/reference/html/index.html#using-spi