- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何映射以下内容:
class Source {
String name;
List<Other> others;
}
class Other {
String otherName;
List<More> mores;
}
class More {
String moreName;
}
class Target {
String name;
String otherName;
String moreName;
}
希望它可以是这样的:
@Mapper
public interface MyMapper {
@Mapping(target = "name", source = "name")
@Mapping(target = "otherName", source = "others[0].otherName")
@Mapping(target = "morename", source = "others[0].mores[0].moreName")
Target map(Source source);
我看到可以使用 'expression = "java(others.get(0).otherName)"' 但在使用表达式时没有空值检查,这可能会导致 NullPointeException。是否可以应用带有空检查和默认值的任何建议?
最佳答案
您可以使用expression
来检查空值并返回一些东西。
@Mapper
public interface MyMapper {
@Mapping(target = "name", source = "name")
@Mapping(target = "otherName", expression = "java(s.others != null && !s.others.isEmpty() ? s.others.get(0).otherName : \"\")")
@Mapping(target = "moreName", expression = "java(s.others != null && !s.others.isEmpty() && s.others.get(0).mores != null && !s.others.get(0).mores.isEmpty() ? s.others.get(0).mores.get(0).moreName : \"\")")
Target map(Source s);
}
// mapstruct code generate.
public class MyMapperImpl implements MyMapper {
@Override
public Target map(Source s) {
if ( s == null ) {
return null;
}
Target target = new Target();
target.name = s.name;
target.otherName = s.others != null && !s.others.isEmpty() ? s.others.get(0).otherName : "";
target.moreName = s.others != null && !s.others.isEmpty() && s.others.get(0).mores != null && !s.others.get(0).mores.isEmpty() ? s.others.get(0).mores.get(0).moreName : "";
return target;
}
}
如果你想要可读性,减少检查null的重复代码,你可以使用接口(interface)default
方法和使用org.springframework.util.ObjectUtils.isEmpty()
。
@Mapper
public interface MyMapper {
@Mapping(target = "name", source = "name")
@Mapping(target = "otherName", expression = "java(getFirstOtherName(s))")
@Mapping(target = "moreName", expression = "java(getFirstMoreName(s))")
Target map(Source s);
default String getFirstOtherName(Source s) {
return !ObjectUtils.isEmpty(s.others) ? s.others.get(0).otherName : "";
}
default String getFirstMoreName(Source s) {
return !ObjectUtils.isEmpty(s.others) && !ObjectUtils.isEmpty(s.others.get(0).mores) ? s.others.get(0).mores.get(0).moreName : "";
}
}
// mapstruct code generate.
public class MyMapperImpl implements MyMapper {
@Override
public Target map(Source s) {
if ( s == null ) {
return null;
}
Target target = new Target();
target.name = s.name;
target.otherName = getFirstOtherName(s);
target.moreName = getFirstMoreName(s);
return target;
}
}
关于java - MapStruct 嵌套列表源以展平目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69679607/
我可以在我们有 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 类,它被称为源
我是一名优秀的程序员,十分优秀!