An open API service indexing awesome lists of open source software.

https://github.com/entur/mapstruct-spi-protobuf

Protobuf accessor naming strategy for Mapstruct
https://github.com/entur/mapstruct-spi-protobuf

javabean mapstruct mapstruct-plugin protobuf protobuf3

Last synced: 12 months ago
JSON representation

Protobuf accessor naming strategy for Mapstruct

Awesome Lists containing this project

README

          

# Mapstruct SPI implementation for protocol buffers [![CircleCI](https://circleci.com/gh/entur/mapstruct-spi-protobuf.svg?style=svg)](https://circleci.com/gh/entur/mapstruct-spi-protobuf)

This naming strategy helps [mapstruct](http://mapstruct.org/) generate working mapping code between your domain classes
and protobuf classes. Both [fullblown Java protobuf](https://github.com/protocolbuffers/protobuf/tree/master/java)
and [protolite](https://github.com/protocolbuffers/protobuf/blob/master/java/lite.md) classes suported.

Requires on mapstruct 1.4.0+.

## ProtobufAccessorNamingStrategy

Extends ```DefaultProtobufAccessorNamingStrategy``` and provides necessary information to map all fields automatically *
except*

* oneof

which require manual mapping.

## ProtobufEnumMappingStrategy

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.

```xml

maven-compiler-plugin



no.entur.mapstruct.spi
protobuf-spi-impl
LATEST.VERSION



-AmapstructSpi.enumPostfixOverrides=com.company.name=INVALID

```

## Support - Mapping functions:

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](support-standard) and/or [protobuf-support-lite](support-lite) folders for a
ready-to-use mapstruct mapper.

# Usage

[See example project](usage/)

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 ... {
```

## Maven

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:

```xml


no.entur.mapstruct.spi
protobuf-spi-impl
LATEST.VERSION

org.mapstruct
mapstruct
${org.mapstruct.version}

```

Complete example:

```xml

org.apache.maven.plugins
maven-compiler-plugin


1.8
1.8


no.entur.mapstruct.spi
protobuf-spi-impl
LATEST.VERSION





org.mapstruct
mapstruct
${org.mapstruct.version}

```

## Gradle

Note: See Maven setup regarding using the same version of mapstruct both in the annotation processor and the general
dependency.

```java
implementation"org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor"org.mapstruct:mapstruct-processor:${mapstructVersion}"
annotationProcessor"no.entur.mapstruct.spi:protobuf-spi-impl:LATEST.VERSION"
```

# More information:

http://mapstruct.org/documentation/stable/reference/html/index.html#using-spi