如何通过从 MapStruct 中的存储库获取来映射到自定义字段类型
How to map to custom field type by fetching from repository in MapStruct
在 springboot 应用程序中我使用了 UserDateAudit
class 这意味着无论哪个实体 class 扩展它, class 自动填充 4 个字段,当它们应该是 createdBy
createdAt
updatedBy
updatedAt
。 UserSummary
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
将被忽略。
通过使用 @InheritConfiguration
,updateBranch
映射将从 toBranch
方法继承配置并忽略 createdBy
映射。
MapStruct 会自动看到 UserSummaryService
中 Long
和 UserSummary
之间有一个映射方法,并会调用它来映射 Branch
中的 createdBy
=] 和 BranchDTO
在 toBranchDTO
方法中。
在 springboot 应用程序中我使用了 UserDateAudit
class 这意味着无论哪个实体 class 扩展它, class 自动填充 4 个字段,当它们应该是 createdBy
createdAt
updatedBy
updatedAt
。 UserSummary
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
将被忽略。
通过使用 @InheritConfiguration
,updateBranch
映射将从 toBranch
方法继承配置并忽略 createdBy
映射。
MapStruct 会自动看到 UserSummaryService
中 Long
和 UserSummary
之间有一个映射方法,并会调用它来映射 Branch
中的 createdBy
=] 和 BranchDTO
在 toBranchDTO
方法中。