【问题标题】:Java: How to add mapper for streamed itemsJava:如何为流项目添加映射器
【发布时间】:2021-11-23 01:06:52
【问题描述】:

我目前有以下控制器方法(有点简化,只显示相关部分):


    @PostMapping(...)
    ...
    public ResponseEntity<List<PresignedUrlsResponse>> getPresignedUrlBatch(@Valid @RequestBody PresignedUrlsRequest urlsRequest) {

        List<PresignedUrlsResponse> presignedUrlResponses = urlsRequest.getRequests().stream().map(request -> {
            // TODO: put this in it's own mapping
            String url = this.mediaService.getPresignedUrl(request.getObjectId(), request.getBucket());

            PresignedUrlsResponse response = new PresignedUrlsResponse();
            response.setId(request.getId());
            response.setUrl(url);
            return response;
        }).collect(Collectors.toList());

        return ResponseEntity.ok().body(presignedUrlResponses);
    }

正如 TODO 中提到的,我想简化这个控制器方法并添加一个映射器。例如,我只习惯于映射来自 db 调用的请求(在其中我将获得一个实体列表),而不是在必须为项目列表调用服务方法时。 有这方面的最佳做法吗?

【问题讨论】:

    标签: java spring mapstruct


    【解决方案1】:

    MapStruct 支持 Stream 到 Collection 和 Stream 到 Stream 的映射。

    但是,在您的用例中,您以List 开头,而不是Stream

    您可以在映射器中移动整个逻辑。

    例如

    @Mapper(componentModel = "spring", uses = {
        PresignedUrlMappingService.class
    })
    public interface PresignedUrlsMapper {
    
        List<PresignedUrlsResponse> map(List<PresignedUrlsRequest> requests);
    
        @Mapping(target = "url", source = "request", qualifiedByName = "presignedUrl")
        PresignedUrlsResponse map(PresignedUrlsRequest request);
    }
    

    您的PresignedUrlMappingService 可能如下所示:

    @Service
    public class PresignedUrlMappingService {
    
        protected final MediaService mediaService;
    
        public PresignedUrlMappingService(MediaService mediaService) {
            this.mediaService = mediaService;
        }
    
        @Named("presignedUrl")
        public String presignedUrl(PresignedUrlsRequest request) {
            return this.mediaService.getPresignedUrl(request.getObjectId(), request.getBucket())
        }
    
    }
    

    最后你的控制器方法看起来像:

        @PostMapping(...)
        ...
        public ResponseEntity<List<PresignedUrlsResponse>> getPresignedUrlBatch(@Valid @RequestBody PresignedUrlsRequest urlsRequest) {
            return ResponseEntity.ok().body(presignedUrlsMapper.map(urlsRequest.getRequests());
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 2023-03-19
      • 2017-01-20
      • 2014-03-14
      • 2013-06-08
      • 2021-08-28
      相关资源
      最近更新 更多