如何在 mapstruct 中使用来自不同 class 的另一个映射
How can I use another mapping from different class in mapstruct
我想将模型对象映射到 dto 模型。我已经有了其中一个对象的映射器。
如何在另一个 class 中的另一个映射器中重用此映射器?
我有以下模特
@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?
- 首先,您不必在 Spring 中创建实例。你可以
只需自动装配您的 Mapper。
- 其次,您不必为以下内容提供
@Mapping
注释
每个字段是否具有相同的名称。 Mapstruct 会为您完成。
- 您的问题可以使用 MapStruct 映射器的
uses
参数来解决
HistoryMapper
可以在 @Mapper
注释参数 uses = IdentifierMapper.class
中。它将自动连接 IdentifierMapper
到
HistoryMapper
。默认情况下,它将通过字段进行。你可以改变它
同样在参数中:injectionStrategy = InjectionStrategy.CONSTRUCTOR
可能就足够了
具有相同的字段名称(标识符)和 MapStruct 应该实现
应该使用 IdentifierMapper
使用 spring 依赖项可以很容易地注入
private final HistoryMapper
historyMapper;
对于目标和源中具有相同名称的字段也无需使用 @Mapping
,因此在上述情况下,下面的映射器定义足以实现所需的结果。
@Mapper(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
uses = {IdentifierMapper.class})
public interface HistoryMapper {
HistoryDynamo toHistoryDynamo(History history);
}
在此处参考 github 示例 https://github.com/rakesh-singh-samples/map-struct-samples/tree/stack-question-60523230/src/sample/mapstruct/mapper
我想将模型对象映射到 dto 模型。我已经有了其中一个对象的映射器。 如何在另一个 class 中的另一个映射器中重用此映射器?
我有以下模特
@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?
- 首先,您不必在 Spring 中创建实例。你可以 只需自动装配您的 Mapper。
- 其次,您不必为以下内容提供
@Mapping
注释 每个字段是否具有相同的名称。 Mapstruct 会为您完成。 - 您的问题可以使用 MapStruct 映射器的
uses
参数来解决HistoryMapper
可以在@Mapper
注释参数uses = IdentifierMapper.class
中。它将自动连接IdentifierMapper
到HistoryMapper
。默认情况下,它将通过字段进行。你可以改变它 同样在参数中:injectionStrategy = InjectionStrategy.CONSTRUCTOR
可能就足够了 具有相同的字段名称(标识符)和 MapStruct 应该实现 应该使用IdentifierMapper
使用 spring 依赖项可以很容易地注入
private final HistoryMapper
historyMapper;
对于目标和源中具有相同名称的字段也无需使用 @Mapping
,因此在上述情况下,下面的映射器定义足以实现所需的结果。
@Mapper(
componentModel = "spring",
injectionStrategy = InjectionStrategy.CONSTRUCTOR,
uses = {IdentifierMapper.class})
public interface HistoryMapper {
HistoryDynamo toHistoryDynamo(History history);
}
在此处参考 github 示例 https://github.com/rakesh-singh-samples/map-struct-samples/tree/stack-question-60523230/src/sample/mapstruct/mapper