Как сопоставить настраиваемый тип поля путем извлечения из репозитория в MapStruct - PullRequest
0 голосов
/ 26 мая 2020

В приложении springboot я использовал класс UserDateAudit, что означает, что какой бы класс сущности его не расширял, в этом классе автоматически заполняются 4 поля, когда они должны быть createdBy createdAt updatedBy updatedAt. Класс UserSummary содержит информацию о User. У меня есть сущность Branch, которая расширяет UserDateAudit. Теперь, когда я конвертирую Branch в BranchDTO, мне также нужен объект UserSummary, чтобы знать, кто создал запись. Записи Branch успешно сохраняются с соответствующим user_id в столбце createdBy db. Итак, я думаю, что у меня будет пользовательская функция в картографе, которая будет брать user_id из Branch, затем находить в Db, затем создавать объект UserSummary и назначать BRanchDTO. Есть ли правильный способ добиться этого?

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public interface BranchMapper
{
    Branch toBranch(BranchDTO branchDTO);
    BranchDTO toBranchDTO(Branch branch);
    List<BranchDTO> toBranchDTOS(List<Branch> branches);
    Branch updateBranch(BranchDTO branchDTO, @MappingTarget Branch branch);

}

DateAudit. java

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(
        value = {"createdAt", "updatedAt"},
        allowGetters = true
)
public abstract class DateAudit implements Serializable
{
    @CreatedDate
    @Column(nullable = false, updatable = false)
    private Instant createdAt;

    @LastModifiedDate
    @Column(nullable = false)
    private Instant updatedAt;
}

UserDateAudit. java

@MappedSuperclass
@JsonIgnoreProperties(
        value = {"createdBy", "updatedBy"},
        allowGetters = true
)
public class UserDateAudit extends DateAudit
{
    @CreatedBy
    @Column(nullable = false, updatable = false)
    private Long createdBy;

    @LastModifiedBy
    @Column(nullable = false)
    private Long updatedBy;
}

Филиал. java

@Entity
@Table(name = "branches")
public class Branch extends UserDateAudit
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank
    @Column(name = "name", nullable = false)
    @Size(max = 20)
    private String name;

    @Column(name = "default_branch", nullable = false)
    private boolean defaultBranch;
}

BranchDTO. java

public class BranchDTO
{
    private Long id;
    private String name;
    private boolean defaultBranch;
    UserSummary createdBy;
}

UserSummary. java

public class UserSummary
{
    private Long id;
    private String username;
    private String name;
}

1 Ответ

1 голос
/ 30 мая 2020

MapStruct имеет возможность использовать другие картографы или сервисы через Mapper#uses.

Давайте представим, что у вас есть сервис, который выглядит следующим образом:

public interface UserSummaryService {

    UserSummary getUserSummary(Long userId);

}

тогда в вашем картографе вы можете сделать:

@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring", uses = UserSummaryService.class)
public interface BranchMapper {

    @Mapping(target = "createdBy", ignore = true)
    Branch toBranch(BranchDTO branchDTO);

    BranchDTO toBranchDTO(Branch branch);

    List<BranchDTO> toBranchDTOS(List<Branch> branches);

    @InheritConfiguration
    Branch updateBranch(BranchDTO branchDTO, @MappingTarget Branch branch);

}

С этим картографом при сопоставлении из BranchDTO в Branch createdBy будет проигнорировано.

При использовании @InheritConfiguration сопоставление updateBranch унаследует конфигурацию из метода toBranch и проигнорирует createdBy сопоставление .

MapStruct автоматически обнаружит, что существует метод сопоставления между Long и UserSummary в UserSummaryService, и вызовет его для сопоставления createdBy между Branch и BranchDTO в toBranchDTO метод.

...