Как управлять затенением в Mapstruct

#mapstruct

#mapstruct

Вопрос:

 public abstract class CaseDTOBase{

       private Integer version;

       public static void mapFromCaseToCaseDTO(Fall fall, CaseDTOBase caseDTOBase) {
        caseDTOBase.setVersion(fall.getVersion());}
       }
    }

public class AufCaseDTO extends CaseDTOBase{

  private Integer version;

  public static AufCaseDTO from(AufFall aufFall, Fall fallGemeldetAnPKR) {

  AufCaseDTO aufCaseDTO = AufCaseDTO.builder().version(aufFall.getVersion()).build();

  CaseDTOBase.mapFromCaseToCaseDTO(aufFall.getFall(), aufCaseDTO);

  return aufCaseDTO;
 }
}
  

Как вы можете видеть, одна переменная использует aufFall.GetVersion(), а другая переменная версии использует aufFall.getFall().GetVersion() , я не могу добавить обе внутри MapStruct, потому что в ней говорится, что она не допускает дублирования. Как я могу сделать это в MapStruct?

     @Mapping(target = "version", source = "aufFall.version")  
    @Mapping(target = "version", source = "aufFall.fall.version")

    @Mapping(target = "pksamAufFallDTO", source = "aufFall")
    AufCaseDTO from(AufFall aufFall, Fall fallGemeldetAnPKR);
  

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

1. Есть только одна версия? Чего вы пытаетесь достичь? Должно aufFall.version быть отображено или альтернатива aufVall.fall.version .

2. Оба должны быть сопоставлены. Это затенение переменной в Java

Ответ №1:

MapStruct не поддерживает использование одного и того же target свойства в нескольких сопоставлениях. Чтобы достичь того, что вы ищете, вам нужно будет написать для этого свой собственный метод.

например

 @Mapper
public interface MyMapper {

    @Mapping(target = "version", source = "aufFall", qualifiedByName = "aufFallToVersion")
    @Mapping(target = "pksamAufFallDTO", source = "aufFall")
    AufCaseDTO from(AufFall aufFall, Fall fallGemeldetAnPKR);

    @Named("aufFallToVersion")
    default Integer toVersion(AufFall AufFall) {
        if (aufFall == null) {
            return null;
        }

        if (aufFall.getVersion() != null) {
            return aufFall.getVersion();
        } else if (aufFall.getFall() != null amp;amp; aufFall.getFall().getVersion() != null) {
            return aufFall.getFall().getVersion();
        } else {
            return null;
        }
    }
}
  

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

1. Спасибо, Филип, я думаю, это сработает для меня. Я не мог поставить «голосовать», потому что у меня не так много прав.

2. Вам не нужно голосовать, но вы можете принять ответ. У вас есть права на это, поскольку вы задали вопрос 🙂