[英]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.