iamcrypticcoder
iamcrypticcoder

Reputation: 2879

MapStruct can't find property both in source and target

Source Class looks like:

Data
@Accessors(chain = true)
@Validated
public class OAuth2ClientCreateRequest {

    @NotNull
    Data data;

    @lombok.Data
    @Accessors(chain = true)
    public static class Data {

        @Pattern(regexp = "oauth2_clients")
        private String type;

        @NotNull
        private OAuth2ClientAttributes attributes;
    }

    @lombok.Data
    @Accessors(chain = true)
    public static class OAuth2ClientAttributes {

        @NotNull @Length(min = 10, max = 256)
        private String clientId;
......

Target Class Looks like:

@Accessors(chain = true)
@Getter
@Setter
@ToString
public class OAuth2Client extends BaseEntity<OAuth2Client> implements Serializable {

    @NotNull
    @Length(min = 10, max = 256)
    @JsonProperty
    private String clientId;

........

Mapper Class:

@Mapper(componentModel = "spring")
public interface OAuth2ClientMapper {

    @Mapping(target = "clientId", source = "attr.clientId")
    OAuth2Client convert(OAuth2ClientCreateRequest.OAuth2ClientAttributes attr);

}

Errors I am getting while doing Maven Compile:

[ERROR] ....../OAuth2ClientMapper.java:[14,52] The type of parameter "attr" has no property named "clientId".
[ERROR] ....../OAuth2ClientMapper.java:[14,52] Unknown property "clientId" in result type .....oauth2authserver.domain.entity.OAuth2Client. Did you mean "null"?

Notice that I am using MapStruct with Lombok. Is there any preprocessor related issues here?

Upvotes: 3

Views: 6289

Answers (2)

Le Manh Cuong
Le Manh Cuong

Reputation: 1

I put lombok before mapstruct in annotationProcessorPaths and it works

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

Upvotes: 0

iamcrypticcoder
iamcrypticcoder

Reputation: 2879

In my project in IntelliJ IDE, Lombok was working without adding any annotation preprocessors because Lombok plugin was downloaded through IntelliJ settings.

Then when it comes to adding map-struct dependency in pom.xml, I had to add annotation preprocessor plugin mapstruct-processor in pom.xml. Then Lombok starts unable to work.

Finally adding annotation processors both for Lombok and Map-Struct like below works -

<properties>
    <java.version>11</java.version>
    <mapstruct.version>1.3.1.Final</mapstruct.version>
    <gson.version>2.8.5</gson.version>
</properties>

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <annotationProcessorPaths>
            <path>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </path>
            <path>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </path>
        </annotationProcessorPaths>
    </configuration>
</plugin>

Upvotes: 3

Related Questions