如何通过从 MapStruct 中的存储库获取来映射到自定义字段类型

How to map to custom field type by fetching from repository in MapStruct

在 springboot 应用程序中我使用了 UserDateAudit class 这意味着无论哪个实体 class 扩展它, class 自动填充 4 个字段,当它们应该是 createdBy createdAt updatedBy updatedAtUserSummary class 包含有关 User 的信息。我有一个扩展 UserDateAudit 的实体 Branch。现在,当我将 Branch 转换为 BranchDTO 时,我还需要 UserSummary 对象才能知道是谁创建了记录。 Branch 记录在 createdBy 数据库列中使用适当的 user_id 成功保存。所以我想我会在映射器中有一个自定义函数,它将从 Branch 中获取 user_id,然后在 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;
}

用户DateAudit.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;
}

Branch.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;
}

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 将被忽略。

通过使用 @InheritConfigurationupdateBranch 映射将从 toBranch 方法继承配置并忽略 createdBy 映射。

MapStruct 会自动看到 UserSummaryServiceLongUserSummary 之间有一个映射方法,并会调用它来映射 Branch 中的 createdBy =] 和 BranchDTOtoBranchDTO 方法中。