簡體   English   中英

Mapstruct 與 Spring Data Jdbc

[英]Mapstruct with Spring Data Jdbc

我正在使用 Spring Data Jdbc,並且我有 2 個與參考 ID 相關的聚合。

public class ResourceEntity {

@Id
@With
private final UUID id;
private String institutionId;
private String version;  
private Long resourceTypeId;

public class ResourceTypeEntity {

@Id @With
private final Long id;
private String name;

我想將其映射為將被翻譯的 GRPC 消息

public class Resource {
    private String institutionId;
    private String version;  
    private String name; <-- This should be mapped after lookup the ResourceTypeEntity byId
}

我已經創建了一個這樣的 ResourceMapper

@Mapper(unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE,
        collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface ResourceMapper {

    ResourceMapper mapper = Mappers.getMapper(ResourceMapper.class);

    @Mapping(target = "name", source = "resourceTypeId", ????
    Resource toResource(ResourceEntity resourceEntity);

    List<Resource> toResources(List<ResourceEntity> resourceEntities);

基本上我想使用 resourceTypeRepository.findById(resourceTypeId) 來獲取 ResourceTypeEntity 並映射名稱。

怎么做?

謝謝

只要您需要自動裝配存儲庫以獲取對象及其名稱以進行進一步映射,您就沒有機會通過接口實現這一點。 但是,您可以改用abstract class與 MapStruct 類生成完全兼容,包括 Spring 組件模型。

@Mapper(
        componentModel = "spring",
        unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE,
        collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED,
        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public abstract static class ResourceMapper {

    @Autowired
    private ResourceTypeRepository repository;

    public abstract Resource toResource(ResourceEntity resourceEntity);

    public abstract List<Resource> toResources(List<ResourceEntity> resourceEntities);

    @AfterMapping
    public void afterMapping(@MappingTarget Resource resource, ResourceEntity entity) {
        
        long id = resourceEntity.getResourceTypeId();

        // Call the repository to fetch ResourceTypeEntity by resourceTypeId
        // The method results in Optional<ResourceTypeEntity> so you might want to 
        // ... throw an exception or use a default value if no entity by id is found
        String name = repository.findById(id)
            .map(ResourceTypeEntity::getName)
            .orElse(null);                      

        resource.setName(name);
    }
}
@Autowire
private ResourceMapper resourceMapper;

void foo() {
    ResourceEntity resourceEntity = ...
    Resource resource = resourceMapper.toResource(resourceEntity);
}

請記住,只要內部的邏輯不是微不足道的並且依賴於數據庫連接和數據,這更像是一種服務,而不僅僅是一個 entity-dto映射器 我寧願創建一個@Service ,它使用interface ResourceMapper和一個不獲取數據的方法(取而代之的是服務層)但通過@Context傳遞name

Resource toResource(ResourceEntity entity, @Context String name);

@AfterMapping
void toResourceAfterMapping(
    @MappingTarget Resource resource, ResourceEntity entity, @Context String name
) {
    resource.setName(name);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM