Внутренний неизменяемый класс с MapStruct

#java #immutability #mapstruct #immutables-library

#java #неизменность #mapstruct #неизменяемые-библиотека

Вопрос:

Мы используем неизменяемые с MapStruct и столкнулись с проблемой при преобразовании сущности в dto.

 @Value.Immutable
public interface ProjectDto {
    String getId();
    String getName();
    //ProjectStatisticsDto getStatistics();
}

@Value.Immutable
public interface ProjectStatisticsDto {
    Long getCount();
}

@Immutable
public interface Project extends Serializable {
    @JsonProperty("_id")
    String getId();
    String getName();
    //ProjectStatistics getStatistics();
}

@Immutable
public interface ProjectStatistics extends Serializable {
    Long getCount();
}
  

Класс mapper

 @Mapper
public interface ProjectMapper {
    ProjectMapper INSTANCE = Mappers.getMapper(ProjectMapper.class);
    ImmProjectDto toDto(ImmProject project); // This works only when the inner model of project statistics is commented.
    //ProjectDto toDto(Project project); THIS DOES NOT WORK (Error 1)
    // ImmProjectDto toDto(ImmProject project); After I uncomment the inner class of project statistics then even this does not work (Error 2)
  

В случаях ошибки проблема точно такая же

 Error 1: No implementation was created for ProjectMapper due to having a problem in the erroneous element com.xyz.ProjectDto. 
Error 2: No implementation was created for ProjectMapper due to having a problem in the erroneous element com.xyz.ProjectStatisticsDto. 
  

Я проверил тесты для mapstruct с неизменяемыми, и я не вижу ничего другого https://github.com/mapstruct/mapstruct/blob/master/integrationtest/src/test/resources/immutablesBuilderTest/mapper/src/main/java/org/mapstruct/itest/immutables/Person.java.

Я пытался удалить операторы сериализации, но безуспешно. Я добавил несколько подробных утверждений, которые говорят

 Note: MapStruct: Immutables found on classpath
Note: MapStruct: Using accessor naming strategy: org.mapstruct.ap.spi.ImmutablesAccessorNamingStrategy
Note: MapStruct: Using builder provider: org.mapstruct.ap.spi.ImmutablesBuilderProvider
Note: MapStruct: Using enum naming strategy: org.mapstruct.ap.spi.DefaultEnumMappingStrategy
  

И это выглядит абсолютно правильно

Ответ №1:

Глядя на заголовок вопроса «Внутренний неизменяемый класс с MapStruct», я предполагаю, что ваши неизменяемые классы находятся внутри другого класса.

Это известная проблема для MapStruct (см. mapstruct / mapstruct #2198), для которой уже есть PR, и она будет исправлена в следующем выпуске без исправления.

Тем временем вам нужно будет сделать ваши неизменяемые классы классами верхнего уровня.