- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 MapStruct 中使用 spring data jdbc。 POJO 与具有所有“仅限内部”数据(如代理键、审计信息等)的表结构保持一致,而域对象是分层的并且仅包含业务相关数据。我必须在特定于表的 POJO(平面结构)和具有嵌套对象的域对象之间进行映射。我怎样才能最好地使用 MapStruct 1.2.0 做到这一点?
// Pojo for table
public class PersonsRecord {
@Id
private Integer surrogateKey; // should not be mapped
private String loginId;
private String name;
private Timestamp memberSince;
// address columns
private Integer houseNumber;
private String addressStreet;
private String addressCity;
private String country;
// getters and setters
}
// Domain object
public class PersonDto {
private String loginId;
private String name;
private Timestamp memberSince;
private Address address;
}
@Mapper(uses = MapperUtils.class)
public interface PersonMapper {
PersonDto toPersonDto(PersonRecord person);
Address toAddress(PersonRecord person);
}
为 toPersonDto
生成的代码会忽略 Address
并且不会像 MapStruct
引用那样调用 toAddress
方法提及。可能是因为这两种方法采用相同的输入类型? toAddress
的生成代码看起来不错。只是它不会由 MapStruct
生成自动连接。
反向映射生成类似。没有自动调用。
有没有办法让它自动(没有自定义方法或装饰器等)?我在很多地方都有类似的模式。
注意:MapperUtils
用于实例化具有不可变字段的 DTO。
更新:我使用 Filip 的答案将 PersonRecord
映射到 PersonDto
,包括 Person.Address
.对于反向映射,我做了以下操作:
@Mapper(uses = MapperUtils.class)
public abstract class PersonMapper {
@Mapping(target = "address", source = "person")
public abstract PersonDto toPersonDto(PersonRecord person);
protected abstract Address toAddress(PersonRecord person);
public abstract PersonRecord toRecord(PersonDto dto);
public abstract void updateAddress(PersonDto dto, @MappingTarget PersonRecord person);
@AfterMapping
protected void updateAddress(PersonDto dto, @MappingTarget PersonRecord record) {
updateAddress(dto, record);
}
}
这没有问题。感谢 Filip 提供指导。
最佳答案
toAddress
方法没有被拾取的原因是MapStruct不知道它需要将toPersonDto
参数映射到PersonDto.address
。您也很可能会收到地址未映射的警告。
为了进行映射,您需要告诉 MapStruct 如何映射地址
。您可以使用 @Mapping
来做到这一点。你的映射器将看起来像
@Mapper(uses = MapperUtils.class)
public interface PersonMapper {
@Mapping(target = "address", source = "person")
PersonDto toPersonDto(PersonRecord person);
Address toAddress(PersonRecord person);
}
更新我忘了添加如何执行反向。
执行反向映射的一种方法是使用自定义 @Mapping
注释,您必须为 Address
中的每个条目执行此操作。这有点麻烦。有一个开放的 MapStruct Pull Request 可以更轻松地完成此映射。公共(public)关系是 mapstruct/mapstruct#1686 .
另一种方法是使用多源参数映射。这看起来像:
@Mapper(uses = MapperUtils.class)
public interface PersonRecordMapper {
default PersonRecord toPersonRecord(PersonDto personDto) {
if (personDto == null) {
return null;
}
return toPersonRecord(personDto, personDto.getAddress());
}
@Mapping(target = "surrogateKey", ignore = true)
PersonRecord toPersonRecord(PersonDto personDto, Address address);
}
当且仅当 Address
中的名称属性与 PersonRecord
中的名称属性匹配时,这将在没有手动 @Mapping
的情况下工作。否则,您仍然需要定义 @Mapping
。
关于mapstruct - 如何将嵌套引用展平为一个简单的目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54580824/
我可以在我们有 String 到 Enum 映射的地方找到答案,但我找不到如何将 Enum 映射到 String。 public class Result { Value enumValue; }
我想使用 MapStruct 映射一个没有源对象的 Target 对象。我试过了,但出现以下错误。 Can't generate mapping method with no input argume
我在单独的文件中有这 3 个类 public class Book { @Id @GeneratedValue private Long id; @NonNull
如何使用 MapStruct 对于以下场景进行 bean 映射。 class Source { private String sourceId; private List courses; //al
是否可以在针对目标 bean 中字符串类型的 bean 属性设置字符串值之前对其进行修剪? 例如,Dozer 通过其映射配置提供了这样的功能, true 另见 Dozer Global C
我收到编译错误: com/mycompany/hibernate5/Main.java:[10,46] cannot find symbol symbol: class Customer_
目前我们在项目中使用 ModelMapper。但是,在该站点中,我看到很多人喜欢 MapStruct。 不确定差异以及我们是否需要真正进行升级。 ModelMapper 和 MapStruct 有什么
我正在使用 map 结构用于在我的 中将 Dto 映射到实体,反之亦然 Spring Boot 应用。 I want to know that, is there a way that i can m
如何在 MapStruct 中完全禁用“构建器”?我根本不想使用它们,因为它们给我带来了各种各样的问题。 我在 META-INF 下创建了服务文件(我更喜欢一种将它分配给映射构建器 = 的方法,但我没
@Mapper @Mapper 将接口或抽象类标记为映射器,并自动生成映射实现类代码。 public @interface Mapper { // 引入其他其他映射器 Class&
我在其他地方看到过这个问题,但不是在相同的上下文中,也没有适合我们用例的答案。 假设我在源对象中有一个列表字段: List mySourceList; 和相应的目标字段: List myTargetL
我在 MapStruct 中使用 spring data jdbc。 POJO 与具有所有“仅限内部”数据(如代理键、审计信息等)的表结构保持一致,而域对象是分层的并且仅包含业务相关数据。我必须在特定
页面信息 public class PageInfoDto implements Serializable { private int currentPageNum; private
在 MapStruct 版本 1.1.0.Final 中,这是可能的.... @Mappings({ @Mapping(target = "transaction.process.detail
我有一个 list List我想映射到另一个列表 List .这些类型如下所示: public class Payment { @XmlElement(name = "Installment"
我要单例Mapper两者兼而有之 create和 update方法。 create 方法生成的代码很好,但是在更新的情况下,我想在目标中设置属性,前提是它们在源中不为空。 我该怎么做 mapStruc
我想使用 mapstruct 在这些对象之间进行映射: MyObj1 -List myObj2List --List myObj3List ---string field1 MyObj4 -List
如何映射以下内容: class Source { String name; List others; } class Other { String otherName; Lis
我想映射以下类 class Schedule { ZoneId timezoneId; List rules; } class AvailabilityRule { long
我是 MapStruct API 的新手,谁能说一下如何进行嵌套映射。 我有两个类,一个是我实际的purchaseOrder 类,它是我的目标类,另一个是EDPurchaseOrder 类,它被称为源
我是一名优秀的程序员,十分优秀!