当前位置: 首页 > 知识库问答 >
问题:

使用MapStruct映射器根据应用程序的环境以编程方式为DTO设置自定义值

齐昊焱
2023-03-14

我有一个MarkdownService,它执行以下操作:

>

  • 打开事务处理

     Markdown markdown = markdownRepository
          .findById(markdownId)
          .orElseThrow(EntityNotFoundException::new);
    
    String originalFilename = storageService.getOriginalFilename(file);
    
    String filename = Markdown.normalizeMdPath(markdownId + "-" + originalFilename);
    
     storageService.store(
          file,
          this.uploadMarkdownsPath,
          filename
        );
    
        markdown.setMdPath(filename);
    
        MarkdownDto dto = MarkdownMapper.INSTANCE.toMarkdownDto(markdown);
    
     String fullPath = ServletUriComponentsBuilder
          .fromCurrentContextPath()
          .path("/markdown/download/")
          .path(dto.getMdPath())
          .toUriString();
    
        dto.setMdPath(fullPath);
    
        return dto;
    
    @Mapper
    public interface MarkdownMapper {
      MarkdownMapper INSTANCE = Mappers.getMapper(MarkdownMapper.class);
    
      MarkdownDto toMarkdownDto(Markdown markdown);
    }
    
      @Transactional
      public MarkdownDto uploadMarkdownFile(Long markdownId, MultipartFile file) throws FileNotFoundException {
        Markdown markdown = markdownRepository
          .findById(markdownId)
          .orElseThrow(EntityNotFoundException::new);
    
        String originalFilename = storageService.getOriginalFilename(file);
    
        String filename = Markdown.normalizeMdPath(markdownId + "-" + originalFilename);
    
        storageService.store(
          file,
          this.uploadMarkdownsPath,
          filename
        );
    
        markdown.setMdPath(filename);
    
        MarkdownDto dto = MarkdownMapper.INSTANCE.toMarkdownDto(markdown);
    
        String fullPath = ServletUriComponentsBuilder
          .fromCurrentContextPath()
          .path("/markdown/download/")
          .path(dto.getMdPath())
          .toUriString();
    
        dto.setMdPath(fullPath);
    
        return dto;
      }
    

    谢谢!

  • 共有1个答案

    贺飞
    2023-03-14

    您可以使用将上下文注入映射器调用并定义@AfterMapping。

    @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.ERROR)
    public interface UserPOMapper {
        UserDTO toUserDTO(UserPO userPo);
        
        @Mapping(target = "id", ignore = true)
        UserPO fromUserDTO(UserDTO userDto);
        
        @AfterMapping
        default void after(@MappingTarget UserDTO.UserDTOBuilder u, @Context String url) {
            u.firstName(url);
        }
        
        UserDTO toUserDTOWithDetails(UserPO userPO, @Context String url);
    }
    
     类似资料:
    • 我有一个在Azure应用服务上运行的ASP. NET Core(RC1)应用程序。该应用程序从环境变量中进行配置。我目前使用Azure门户的“应用程序设置”页面来设置这些环境变量。该应用程序与Kudu一起部署(如果这相关?) 我想要一种以编程方式设置这些环境变量的方法,这样我就不必每次想要创建新的环境变量或修改现有环境变量时都通过Azure门户。理想情况下,我想通过调用REST API来做到这一点

    • 我不熟悉Mapstruct,在特定用例中遇到问题 因此,如果我的来源属性hotmail.com我的目标属性应该收到“个人”,如果我的来源facebook.com我的目标应该收到“公司”。 我想用表达法,但没法绕过它。我该怎么做?

    • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。

    • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

    • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?

    • 我有两个对象,除了date成员外,其他成员都相同。在obj1中,date是java.sql.date,obj2.date是long(纪元)。 我需要编写一个映射器来将obj1映射到obj2。这就是我试图做的: 但是mapperImpl只有自己的日期转换实现: 我得到了: 这种转换的正确方式是什么?