Nano Hash - криптовалюты, майнинг, программирование

Какой была бы конфигурация для mapStruct, чтобы прекратить отображение полей суперкласса DTO?

У меня есть класс 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, чтобы добавить ссылки ненависти к ответу контроллера.

Интерфейс 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 value)».

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

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

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


Ответы:


1

Чтобы игнорировать поля в индивидуальном порядке, вы можете использовать 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);
}
24.03.2019
  • что бы здесь BaseEntity? Интерфейс / класс, реализованный всеми моими классами сущностей? или классы DTO? 24.03.2019
  • Это будет интерфейс / класс, реализованный / расширенный всеми вашими классами сущностей. Классы DTO расширяют ResourceSupport 24.03.2019
  • Есть ли способ унаследовать несколько config? (поскольку этот подход не масштабируется). Альтернативный подход может использовать @AfterMapping, но он затрудняет чтение сгенерированного сопоставителя, поскольку нам нужно прыгать вперед и назад, чтобы увидеть сопоставления. 14.05.2020
  • Для этого есть запрос функции, в настоящее время такой вещи нет из коробки 17.05.2020

  • 2

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

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

    24.03.2019
  • Это не полностью связано с классом модели, то есть User здесь. Если я удалю extends ResourceSupport из UserMinimalDto, картограф будет идеально отображать оба пути. Это ResourceSupport причина проблемы. 24.03.2019
  • У меня есть другие DTO и мапперы, которым не требуется ResourceSupport, и они идеально отображают поле в обоих направлениях. 24.03.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..