gpt4 book ai didi

java - 如何从java流中的接口(interface)调用MapStruct方法

转载 作者:行者123 更新时间:2023-12-02 01:21:28 26 4
gpt4 key购买 nike

我最近开始在项目中使用 MapStruct 映射工具。过去,为了映射 DTO -> 实体,反之亦然,我使用自定义映射器,例如:

public static CustomerDto toDto(Customer customer) {

return isNull(customer)
? null
: CustomerDto.builder()
.id(customer.getId())
.name(customer.getName())
.surname(customer.getSurname())
.phoneNumber(customer.getPhoneNumber())
.email(customer.getEmail())
.customerStatus(customer.getCustomerStatus())
.username(customer.getUsername())
.NIP(customer.getNIP())
.build();
}

万一当我尝试获取一个可选对象时,我最终能够通过以下方式将我的实体映射到 dto:

public Optional<CustomerDto> findOneById(final long id) {
return customerRepository.findById(id).map(CustomerMapper::toDto);
}

目前,正如我之前提到的,我正在使用mapStruct,问题是我的映射器,而不是类,它的接口(interface)如下:

@Mapper
public interface CommentMapper {

@Mappings({
@Mapping(target = "content", source = "entity.content"),
@Mapping(target = "user", source = "entity.user")
})
CommentDto commentToCommentDto(Comment entity);

@Mappings({
@Mapping(target = "content", source = "dto.content"),
@Mapping(target = "user", source = "dto.user")
})
Comment commentDtoToComment(CommentDto dto);

}

我想知道是否可以在流中以某种方式使用此接口(interface)方法来映射我的值而不包装值,例如:

public Optional<CommentDto> findCommentById(final long id) {

Optional<Comment> commentById = commentRepository.findById(id);
return Optional.ofNullable(commentMapper.commentToCommentDto(commentById.get()));
}

感谢您的帮助。

最佳答案

访问映射器,如下所示:

private static final YourMapper MAPPER = Mappers.getMapper(YourMapper.class);

final Optional<YourEntity> optEntity = entityRepo.findById(id);
return optEntity.map(MAPPER::toDto).orElse(null);

基本上我们对枚举做了类似的事情

 @Mapping(target = "type", expression = "java(EnumerationType.valueOf(entity.getType()))")

您可以在 @Mapping 注释中定义 java 表达式

@Mapping(target = "comment", expression = "java(commentMapper.commentToCommentDto(commentRepository.findById(entity.commentId).orElse(null)))"

否则你应该能够使用

class CommentMapper { ... }

您可以自动引用

@Mapper(uses = {CommentMapper.class})

您的实现将检测 commentEntity 和 Dto 并自动使用 CommentMapper。

MapStruct 映射器的工作原理如下:Shit in Shit out,所以请记住您的实体需要 commentEntity,以便 dto 可以拥有 commentDto。

编辑

第二个解决方案可以使用:

@BeforeMapping
default void beforeMappingToDTO(Entity source, @MappingTarget Dto target) {
target.setComment(commentMapper.commentToCommentDto(commentRepository.findById(entity.commentId).orElse(null)));
}

关于java - 如何从java流中的接口(interface)调用MapStruct方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57604389/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com