Какова будет конфигурация для mapStruct, чтобы остановить отображение полей суперкласса DTO? - PullRequest
0 голосов
/ 24 марта 2019

У меня есть класс DTO, который расширяет класс spring-hateoas ResourceSupport.UserMinimalDto - это DTO для User сущности.

Итак, для генерации классов сопоставления я использую mapStruct .

@Data //from lambok
@EqualsAndHashCode(callSuper=false)
public class UserMinimalDto extends ResourceSupport {

    String firstName;
    String lastName;
    String email;
    String uniqueId;
    String profilePicUrl;

}

Я используюResourceSupport для добавления ссылок hateoas в ответ от контроллера.

Интерфейс Mapper

@Mapper
public interface UserMinimalMapper {

    UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;

    UserMinimalDto entityToDto(User user);

    User dtoToEntity(UserMinimalDto userMinimalDto);
}

Но когда я запускаю mvn clean install в проекте, я сталкиваюсь с ошибкой компиляции

Невозможно сопоставить свойство "org.springframework.hateoas.Link id" с "java.lang.Integer id".Попробуйте объявить / реализовать метод сопоставления: «java.lang.Integer map (значение org.springframework.hateoas.Link)».

Это потому, что mapStruct пытается сопоставить поляResourceSupport.Это работает, если:

  1. Я удаляю extends ResourceSupport из UserMinimalDto
  2. Я удаляю dtoToEntity (UserMinimalDto userMinimalDto);из интерфейса mapper

Какая конфигурация скажет mapStruct не отображать поля суперкласса?

Ответы [ 2 ]

3 голосов
/ 24 марта 2019

Чтобы игнорировать поля в каждом конкретном случае, вы можете использовать Mapping#ignore.

В вашем случае это будет выглядеть так:

@Mapper
public interface UserMinimalMapper {

    UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;

    UserMinimalDto entityToDto(User user);

    @Mapping(target = "id", ignore = true)
    @Mapping(target = "links", ignore = true)
    User dtoToEntity(UserMinimalDto userMinimalDto);
}

В случае, если у вас есть общиеИнтерфейс / класс для ваших сущностей вы можете использовать @MapperConfig и определить эти исключения.

Это может выглядеть примерно так:

@MapperConfig(mappingInheritanceStrategy = MappingInheritanceStrategy.AUTO_INHERIT_FROM_CONFIG)
public interface CommonMappingConfig {

    @Mapping(target = "id", ignore = true)
    @Mapping(target = "links", ignore = true)
    BaseEntity map(ResourceSupport resourceSupport);

}

@Mapper(config = CommonMappingConfig.class)
public interface UserMinimalMapper {

    UserMinimalMapper INSTANCE = Mappers.getMapper(UserMinimalMapper.class) ;

    UserMinimalDto entityToDto(User user);

    User dtoToEntity(UserMinimalDto userMinimalDto);
}
1 голос
/ 24 марта 2019

Это потому, что класс модели имеет другой набор полей, чем DTO, и ваш картограф отображает оба пути. Но это вполне естественно, у dto нет идентификатора.

Обходной путь может состоять в том, чтобы исключить эти поля из сопоставления, например, пометив id и другие поля в классе модели, которые не имеют dto с: Mapping("this").

...