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

如何在mapstruct中使用来自不同类另一个映射

漆雕安晏
2023-03-14

我想把一个模型对象映射到dto模型。我已经有一个对象的映射器。我如何在另一个类中的另一个映射器中重用这个映射器?

我有下面的模型

    @Getter
    @AllArgsConstructor
    @ToString
    public class History {

      @JsonProperty("identifier")
      private final Identifier identifier;

    @JsonProperty("submitTime")
    private final ZonedDateTime submitTime;

    @JsonProperty("method")
    private final String method;

    @JsonProperty("reason")
    private final String reason;

    @JsonProperty("dataList")
    private final List<Data> dataList;
   }

     @DynamoDBTable(tableName = "history")
     @Data
     @NoArgsConstructor
     public class HistoryDynamo {
        @DynamoDBRangeKey(attributeName = "submitTime")
        @DynamoDBTypeConverted(converter = ZonedDateTimeType.Converter.class)
        private ZonedDateTime submitTime;

        @DynamoDBAttribute(attributeName = "identifier")
        @NonNull
        private Identifier identifier;

        @DynamoDBAttribute(attributeName = "method")
        private String method;

         @DynamoDBAttribute(attributeName = "reason")
         private String reason;

         @DynamoDBAttribute(attributeName = "dataList")
         private List<Data> dataList;
     }

        @Data
        @DynamoDBDocument
        @NoArgsConstructor
        public class Identifier implements Serializable {
    
            @DynamoDBAttribute(attributeName = "number")
            private String number;
    
        @DynamoDBAttribute(attributeName = "cityCode")
        @NonNull
        private String cityCode;
    
        @DynamoDBAttribute(attributeName = "countryCode")
        @NonNull
        private String countryCode;
    
        @DynamoDBTypeConverted(converter = LocalDateType.Converter.class)
        private LocalDate mydate;
    }
    
         @Data
         @EqualsAndHashCode
         @NoArgsConstructor
         @RequiredArgsConstructor
         @JsonInclude(JsonInclude.Include.NON_NULL)
         public class Identifier implements Serializable {
    
        @NonNull
        @lombok.NonNull
        @NotNull
        private String number;
    
        @NonNull
        @lombok.NonNull
        @NotNull
        private City city;
    
        @NonNull
        @lombok.NonNull
        @NotNull
        private Country country;
    
        @JsonDeserialize(using = LocalDateDeserializer.class)
        @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'Z'")
        @DateTimeFormat(pattern = "yyyy-MM-dd'Z'")
        @NonNull
        @lombok.NonNull
        @NotNull
        private LocalDate mydate;
    }

这是我的地图

    @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN, injectionStrategy = InjectionStrategy.CONSTRUCTOR, nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL)
    public interface IdentifierMapper {
    
        IdentifierMapper MAPPER = Mappers.getMapper(IdentifierMapper.class);
    
    
        @Mappings({@Mapping(source = "identifier.number", target = "number"),
                   @Mapping(source = "identifier.city.code", target = "cityCode"),
                   @Mapping(source = "identifier.country.code", target = "countryCode"),
                   @Mapping(source = "identifier.mydate", target = "mydate")})
        @Named("toIdentifierDynamo")
        myproject.entity.dynamo.Identifier toIdentifierDynamo(myproject.model.Identifier identifier);
    }
    
    @Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.WARN, injectionStrategy = InjectionStrategy.CONSTRUCTOR,
            nullValueMappingStrategy = NullValueMappingStrategy.RETURN_NULL, uses = {IdentifierMapper.class})
    public interface HistoryMapper {
    
        HistoryMapper MAPPER = Mappers.getMapper(HistoryMapper.class);
    
        @Mappings({@Mapping(source = "identifier", target = "identifier", qualifiedByName = "toIdentifierDynamo"),
                  @Mapping(source = "method", target = "method"),
                  @Mapping(source = "reason", target = "reason"),
                  @Mapping(source = "timestamp", target = "timestamp")})
        HistoryDynamo toHistoryDynamo(History history);
    }

我希望将History映射到HistoryDynamo并重用IdentifierMapper映射HistoryDynamo中的一个对象。如何在ToHistoryDynamo中使用toIdentifierDynamo?

共有1个答案

阎唯
2023-03-14
  • 首先,您不必在Spring中创建实例。您只需自动绘制映射器即可。
  • 其次,如果每个字段名称相同,则不必为其提供@mapping注释。Mapstruct将为您完成。
  • 您的问题可以使用useMapStruct映射器的参数historymapper可以在@mapper注释参数use=identifiermapper.class中使用。它将IdentifierMapper自动转换为HistoryMapper。默认情况下,它将通过字段执行。您还可以在参数中更改它:injectionstrategy=injectionstrategy.constructor,这可能就足够了,因为您有相同的字段(标识符)名称,MapStruct应该意识到应该使用identifiermapper
 类似资料:
  • 我在我的项目中使用了mapstruct,它可以直接工作(所有的mapper都在一个包中)。现在我有了将一个映射器移动到另一个包的要求,但这并不能很好地工作。 你能帮我解决这个问题吗? 编辑包结构1的结果CarMapperImpl.java:

  • 我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。 在Java中,这是这样的:。 应该如何使用Kotlin实现它?

  • 我刚开始使用Java,到处搜索,但无论出于何种原因都无法找到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,该文件夹是我的包,为了说明: 我需要在第2类中创建第1类的实例,但它就是不起作用。这是一个示例: 文件路径: 文件路径: 我得到这个错误 根据要求,完整的源代码:注:class1=ClientIndividual,class2=涉众 第一个文件 第二个文件 第三个文件(接口

  • 我有两个IntelliJ IDEA Java项目;项目A和项目B。我想在ProjectB中导入并使用ProjectA中的代码。我该怎么做? 在Eclipse中,我只需转到ProjectB的构建路径设置并添加ProjectA。

  • 我刚开始Java,到处搜索,但无论出于什么原因都找不到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,那个文件夹是我的包,所以举例来说: 我需要在类2中创建一个类1的实例,但它就是不起作用。以下是一个示例: 文件路径: 文件路径:

  • 我有一个映射器,对于目标类的特定属性,需要从源对象内的对象列表中选择一个,并使用不同的映射器类对其进行映射。 简化了很多,类包含一个对象列表,我的类如下所示: 问题是,被生成为中的code>属性,但不是,因此生成失败,因为MapStruct找不到。 我最好的猜测是,这是由于在中没有其他方法显式地使用,因此Mapstrt决定不需要它,并且没有在实现中注入它。 那么,是否有任何方法可以强制MapSTR