Проблема Mapstruct: ошибка неизвестного свойства

#gradle #lombok #mapstruct #annotation-processing

#gradle #ломбок #mapstruct #обработка аннотаций

Вопрос:

Я использую mapstruct и lombok вместе и испытываю некоторые проблемы с этим:

 EntityMapper.java:10: error: Unknown property "id" in result type Entity. Did you mean "null"?
    @Mapping(target = "id", ignore = true)
                      ^
 

Мои классы Entity и EntityDto:

 @Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Entity {

    private int id;

    private String property;
}

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class EntityDto {

    private String property;
}
 

EntityMapper:

 @Mapper(implementationName = "MapStruct<CLASS_NAME>")
public interface EntityMapper {

    // neither of them work
    @Mapping(target = "id", ignore = true)
    //@Mapping(target = "id", defaultValue = "0")
    Entity map(EntityDto dto);

    EntityDto map(Entity entity);

}
 

В этой конфигурации это приводит к ошибке времени компиляции. Поэтому я попытался прокомментировать аннотацию @Mapping. Он скомпилирован, но сопоставляет все свойства с null. Реализация, созданная MapStructEntityMapper:

 public class MapStructEntityMapper implements EntityMapper {
    public MapStructEntityMapper() {
    }

    public Entity map(EntityDto dto) {
        if (dto == null) {
            return null;
        } else {
            Entity entity = new Entity();
            return entity;
        }
    }

    public EntityDto map(Entity entity) {
        if (entity == null) {
            return null;
        } else {
            EntityDto entityDto = new EntityDto();
            return entityDto;
        }
    }
}
 

Я нашел пару ответов, в которых говорится о процессорах аннотаций, но взгляните на мой файл build.gradle:

 // MapStruct - Entity-DTO mapper                             
implementation 'org.mapstruct:mapstruct:1.4.1.Final'         
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.1.
compile 'org.projectlombok:lombok-mapstruct-binding:0.1.0'   
// Util                                                      
// lombok                                                    
compileOnly 'org.projectlombok:lombok:1.18.16'               
annotationProcessor 'org.projectlombok:lombok:1.18.16'       
testCompileOnly 'org.projectlombok:lombok:1.18.16'           
testAnnotationProcessor 'org.projectlombok:lombok:1.18.16'   
 

Некоторое время это работало, если я компилировал без аннотации @Mapping, а затем запускал с этой аннотацией, но теперь даже это не работает.

Комментарии:

1. вот репозиторий github

Ответ №1:

Похоже, это проблема с lombok-mapstruct-binding .

Это должно быть в той же области, что и процессоры. Вам нужно поместить его в annotationProcessor и не compile