首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mapstruct:当Source为Null (两个字段具有相同的名称和类型)时,如何将目标字符串默认为空字符串Java / Spring

Mapstruct是一个Java注解处理器,用于简化Java对象之间的映射。它可以自动生成类型安全的映射代码,减少手动编写映射代码的工作量。

当Source为Null且目标字段具有相同的名称和类型时,可以通过在Mapstruct映射接口中使用nullValueMappingStrategy属性来设置目标字段的默认值。在Java / Spring中,可以使用NullValueMappingStrategy枚举类来指定默认值的策略。

以下是一些常用的NullValueMappingStrategy枚举值及其含义:

  1. RETURN_DEFAULT:如果源字段为Null,则返回目标字段的默认值。对于字符串类型,默认值为空字符串。
  2. SET_TO_DEFAULT:如果源字段为Null,则将目标字段设置为其默认值。对于字符串类型,默认值为空字符串。
  3. SET_TO_NULL:如果源字段为Null,则将目标字段设置为Null。

根据具体的业务需求,可以选择适合的NullValueMappingStrategy枚举值来处理源字段为Null的情况。

以下是一个示例代码,展示了如何在Mapstruct中设置目标字段的默认值为空字符串:

代码语言:txt
复制
@Mapper
public interface MyMapper {
    MyMapper INSTANCE = Mappers.getMapper(MyMapper.class);

    @Mapping(target = "targetField", source = "sourceField", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
    TargetObject map(SourceObject source);

    @Mapping(target = "targetField", source = "sourceField", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
    void updateTarget(SourceObject source, @MappingTarget TargetObject target);
}

在上述示例中,nullValueMappingStrategy属性被设置为NullValueMappingStrategy.RETURN_DEFAULT,这意味着如果源字段为Null,则目标字段将被设置为默认值,对于字符串类型,默认值为空字符串。

关于Mapstruct的更多信息和用法,请参考腾讯云的相关产品和文档:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

对象拷贝 - 优雅解决方案 Mapstruct

在编译过程中,MapStruct会生成此接口实现。该实现使用纯java方法调用目标对象之间映射,MapStruct节省了时间,通过生成代码完成繁琐容易出错代码逻辑。。...1> Java基本数据类型及其相应包装类型,如 int Integer,boolean Boolean 等生成代码是 null 转换一个包装型成相应原始类型一个感知,即 null 检查将被执行...manufacturingDate 属性调用 映射集合 : 集合类型(映射 List,Set 等等) 以相同方式映射 bean类型,通过定义与在映射器接口所需目标类型映射方法。...List carsToCarDtos(Stream cars);     CarDto carToCarDto(Car car); } 映射枚举 : 默认情况下,源枚举中每个常量映射到目标枚举类型具有相同名称常量...; } 确定结果类型 : 结果类型具有继承关系,选择映射方法(@Mapping) 或工厂方法(@BeanMapping) 可能变得不明确。

6.6K20

MapStruct才是王者!【附源码】

CarDto ,方法名可以自由选择; 对于源对象目标对象中具有不同名称属性,可以使用 @Mapping 注释来配置名称; 对于源对象目标对象中具有不同类型属性,也可以使用 @Mapping 注释来进行转换...,默认是将具有相同名称属性进行映射,当然也可以用 source、expression 或者 constant 属性手动指定,接下来我们来分析下常用属性值。...target:属性目标名称,同一目标属性不能映射多次。如果用于映射枚举常量,则将给出常量成员名称,在这种情况下,源枚举中多个值可以映射到目标枚举相同值。...source:属性名称, 如果带注释方法有多个源参数,则属性名称必须使用参数名称限定,例如“addressParam.city"; 找不到匹配属性MapStruct 将查找匹配参数名称;...constant:设置指定目标属性常量字符串指定目标属性类型:primitive 或 boxed(例如 Long)MapStruct 检查是否可以将该 primitive 作为有效文本分配给

1.9K20

Java对象拷贝_对象拷贝有几种方法

MapstructMapStruct是一个Java 注释处理器,用于Java Bean类生成类型安全高性能映射器。它使您不必手工编写映射代码,这是一个繁琐且容易出错任务。...与运行时工作映射框架相比,MapStruct具有以下优点: 通过使用普通方法调用而不是反射来快速执行 编译类型安全。只能映射彼此映射对象属性,因此不会将订单实体意外映射到客户DTO等。...如果你仅是在日常处理少量对象,选取哪个其实变得并不重要,但数据量大建议还是使用MapStruct 或 BeanCopier 方式,提高接口性能 一、背景 1.1 对象拷贝概念 Java中,数据类型分为值类型...3.1.3 小节 BeanCopier只拷贝名称类型相同属性。...3.3 BeanCopier总结 源类目标属性名称类型相同,拷贝没问题。 源对象目标对象属性名称相同类型不同,那么名称相同类型不同属性不会被拷贝。

4.8K10

MapStruct1.5使用教程(高级版)

MapStruc主要特性 1、类型安全:MapStruct在编译生成映射代码并进行类型检查,如果源对象目标对象属性不匹配,会在编译阶段就报错。...这在源目标字段之间需要一些特定逻辑非常有用。...@ValueMapping 注解指定了源枚举值到目标枚举值映射。 此外,MapStruct 还提供了特殊源/目标NULL ANY,可以用于处理源枚举值 null 或未映射情况。...在生成映射代码中,MapStruct 会将每个源对象映射一个目标对象,并将它们添加到目标对象集合中。需要注意是,源对象集合目标对象集合元素类型可以不同,此时需要手动指定元素类型转换方式。...elementTargetType:用于指定目标对象集合元素类型。 nullValueMappingStrategy:用于处理源对象集合中包含对象或者 null情况。

87710

mapstruct使用正确姿势

这个啊,阿淼我开始也是好奇,所以就和 BeanUtils 深入交流了一番,最后才发现,BeanUtils 就是一个大老粗,只能同属性映射,或者在属性相同情况下,允许被映射对象属性少;但遇到被映射属性数据类型被修改或者被映射字段名被修改...UserVO2 { private Integer id; private String name; private String createTime;}复制代码 2.2、定义接口: 实体类被映射对象属性相同或者被映射对象属性至少几个...,结果是这样子: 从图中我们可以看到,编译使用了expression中定义表达式对目标字段 createTime 进行了转换;然后你还会发现 updateTime 字段也被自动从 LocalDateTime...小结: 字段类型不一致,以下类型之间是 mapstruct 自动进行类型转换: 1、基本类型及其他们对应包装类型。 此时 mapstruct 会自动进行拆装箱。...,可以说是相当优秀了,但这也仅仅是优秀,而更秀还请继续往下看: 阿淼小结: 字段名不一致,通过使用 @Mappings 注解指定对应关系,编译后即可实现对应字段赋值。

1.4K10

mapstruct使用正确姿势

这个啊,阿淼我开始也是好奇,所以就和 BeanUtils 深入交流了一番,最后才发现,BeanUtils 就是一个大老粗,只能同属性映射,或者在属性相同情况下,允许被映射对象属性少;但遇到被映射属性数据类型被修改或者被映射字段名被修改...UserVO2 { private Integer id; private String name; private String createTime; } 2.2、定义接口: 实体类被映射对象属性相同或者被映射对象属性值少几个...,结果是这样子: 从图中我们可以看到,编译使用了expression中定义表达式对目标字段 createTime 进行了转换;然后你还会发现 updateTime 字段也被自动从 LocalDateTime...阿淼小结: 字段类型不一致,以下类型之间是 mapstruct 自动进行类型转换: 1、基本类型及其他们对应包装类型。 此时 mapstruct 会自动进行拆装箱。...,可以说是相当优秀了,但这也仅仅是优秀,而更秀还请继续往下看: 阿淼小结: 字段名不一致,通过使用 @Mappings 注解指定对应关系,编译后即可实现对应字段赋值。

1.1K10

帮助 Java 开发人员进行 Bean 映射 8 大框架

尽管将一个对象映射到另一个对象是很常见,但由于这两个具有相似或相同映射属性,它通常可能是迭代且乏味。幸运是,有几个 Java 映射框架可以用来递归地将数据从一个对象复制到另一个对象。...注解 类目的地{ @JMap 字符串标识; @JMap("SourceField") 字符串目标字段; 其他字符串; // getter setter } 类源{...私有字符串类型; //构造函数、getter、setter等 } 这两个类几乎相同,只是座位数属性具有不同名称,并且 Car 类中枚举类型属性是 DTO 中字符串。...要将两个 bean 或对象相互映射,首先要声明目标源类,如下所示: 类 BasicPerson { 私有字符串名称; 私人年龄; 私人日期出生日期; // getter/setter...要映射两个对象,您需要创建源类目标类。 Java Bean 框架可以通过 Maven Gradle 等命令行构建轻松访问

2.2K10

NullException、Token作用、Mapstruct用法

1.Java指针异常 指针出现: 从对象中获取 / 修改值,如从数据库获取数据赋值给对象,再从当前对象中取值。...访问或修改对象字段Null长度(如数组) 将Null抛出 规避指针出现: 在使用对象,确保将其初始化 声名引用变量,必须从对象请求方法或字段之前,做判空处理 参考文章:NullException...基于JWTToken认证机制 一个JWT实际上就是一个字符串,它由三部分组成:头部、载荷与签名。将这三段信息文本用.链接一起就构成了Jwt字符串。...以及调用getter/setter方法进行属性赋值 MapStruct优点: 通过使用普通方法调用而不是反射来快速执行 编译类型安全性:只能映射相互映射对象属性,不能将订单实体意外映射到客户DTO...source:代表转换源 target:代表转换目标 MapStruct:参考文章 使用MapStruct无法遵循isXXX命名规则,官方认为这个不是bug也不会为此做出改变。

1.4K42

IntelliJ IDEA专用编程提效插件,用好这些辅助编程插件,就让那些不会用工具的人慢慢加班码代码吧!

MapStruct MapStruct 是一个 Java 编译注解处理框架,用来自动化将一种 Java Bean 对象映射成另一种类型对象。...该框架主要目标是使开发人员在尽可能少代码最低运行时间成本下实现属性映射。...MapStruct 具有以下主要特性: 简洁:简化了 Java Beans 之间转换代码,自动生成使用简单赋值语句完成映射实现。...安全:通过在编译生成映射代码,MapStruct 提供了类型安全映射,并能在编译就发现潜在错误。 灵活:可通过自定义转换方法、类型转换映射策略等来满足复杂映射需求。...Source source); } 转化成 target 对象,createTime字段值,会设置System.currentTimeMillis(),生成代码如下: @Component

22710

mapstruct最佳实践

Spring 方式,@Mapper 注解 componentModel 属性值 spring,不过应该大多数都用此模式进行开发。...二、自定义属性类型转换方法 一般常用类型字段转换 MapStruct都能替我们完成,但是有一些是我们自定义对象类型MapStruct就不能进行字段转换,这就需要我们编写对应类型转换方法,笔者使用是...示例中User对象config属性是一个JSON字符串,UserVo对象中是List类型,这需要实现JSON字符串与对象互转。...定义好方法之后,MapStruct匹配到合适类型字段,会调用我们自定义转换方法进行转换。...1999-09-27, createTime=2020-01-18T15:32:54, config=[{"field1":"Test Field1","field2":500}]) } 四、常见问题 两个对象属性不一致

2.4K30

第三十章:SpringBoot使用MapStruct自动映射DTO

MapStruct是一种类型安全bean映射类生成java注释处理器。 我们要做就是定义一个映射器接口,声明任何必需映射方法。在编译过程中,MapStruct会生成此接口实现。...该实现使用纯java方法调用目标对象之间映射,MapStruct节省了时间,通过生成代码完成繁琐容易出错代码逻辑。...@Mapping注解我们用到了两个属性,分别是source、target source代表是映射接口方法内参数名称,如果是基本类型参数,参数名可以直接作为source内容,如果是实体类型,则可以采用实体参数名...target代表是映射到方法方法值内字段名称,配置如上面GoodInfoMapper所示。...; } } MapStruct根据我们配置@Mapping注解自动将source实体内字段进行了调用target实体内字段setXxx方法赋值,并且做出了一切参数验证。

5K70

MapStruct 才是王者!一文玩转 MapStruct 全场景【附源码】

1MapStruct 什么是 MapStructMapStruct 是一个代码生成器,它基于约定优于配置方法,极大地简化了 Java bean 类型之间映射实现。...,而是通过编译自动生成基于 getter/setter 转换实现类; 性能高 基于简单get、set操作,效率达到最佳 编译类型安全 只能映射相同名称或带映射标记属性; 编译产生错误报告 如果映射不完整或映射不正确则会在编译抛出异常...MapStruct 常用重要注解 : @Mapper 标记这个接口作为一个映射接口,并且是编译 MapStruct 处理器入口 @Mapping 解决源对象目标对象中,属性名字不同情况 @Mappings...两个对象间不同名称间属性值拷贝 测试对象 // UserDTO 略......测试场景 分别通过MapStruct BeanUtils 将相同对象转换100W次,看看整体耗时 测试代码 /** * BeanUtils与MapStruct性能对比 */ public class

3.8K21

满屏get & set 太Low了?试试 MapStruct 高级玩法

1MapStruct 什么是 MapStructMapStruct 是一个代码生成器,它基于约定优于配置方法,极大地简化了 Java bean 类型之间映射实现。...,而是通过编译自动生成基于 getter/setter 转换实现类; 性能高 基于简单get、set操作,效率达到最佳 编译类型安全 只能映射相同名称或带映射标记属性; 编译产生错误报告 如果映射不完整或映射不正确则会在编译抛出异常...MapStruct 常用重要注解 : @Mapper 标记这个接口作为一个映射接口,并且是编译 MapStruct 处理器入口 @Mapping 解决源对象目标对象中,属性名字不同情况 @Mappings...,可以不配置Mappings // 会自动把两个源对象中属性复制到目标对象 @Mappings({ @Mapping(source = "userDTO.name...两个对象间不同名称间属性值拷贝 测试对象 // UserDTO 略...

3.1K20

你居然不知道MapStruct

(实际测试实际测试SpringBeanUtils在生成 次数1000000需要1.6秒,而使用MapStruct仅需要69毫秒)。...2.成员变量名不相同使用 Studnet类agename与StudentVO类ageVOnameVO对应不上 在Mapper类中加入@Mapping注解指定原对象字段要被对应上字段名...只需要在Mapper接口中@Mapper注解中加入componentModel = "spring"即可。 7.数据类型转换 映射属性在源对象目标对象中具有相同类型,这种情况不全有。...默认情况下,源枚举中每个常量都映射到目标枚举类型具有相同名称常量。如果需要,可以使用@ValueMapping注解将源枚举中常量映射到具有其他名称常量。...枚举值一样,直接使用@Mapping来指定映射源目标名称即可 枚举值不一致,使用@ValueMapping注解。

2.3K31

BeanCopy坑到MapStruct技巧

主要优点如下: 简化配置:使用 MapStruct 可以简化 Java Bean 对象拷贝配置,避免了使用 Bean Copy 出现配置问题; 提高效率:MapStruct 在编译时会自动将...Java Bean 对象拷贝代码进行优化,提高了拷贝效率; 支持复杂类型MapStruct 支持复杂 Java Bean 对象之间属性拷贝,包括集合、继承、多态等; 易于维护:使用 MapStruct...下面列一下 MapStruct 常见一些用法 使用 @Mapper 注解,添加 componentModel = "spring" 参数可以指定使用 Spring 作为注入依赖框架,这样就可以在我们业务...注解,并指明需要转换源对象名字目标对象名字就可以了,并且支持多层级对象。...MapStruct 都是 Java 中用于对象之间复制属性工具,它们可以大大简化代码编写维护。

27010

试试这个优雅方法...

但是像这种的话,需要类型名称都一样才会进行映射,有很多时候,由于不同团队之间使用名词不一样,还是需要很多手动 set/get 等功能。...3.4 易于 debug 在我们生成代码中,我们可以轻易进行 debug。 MapStruct使用案例 4.1 属性名称相同 在实现类时候,如果属性名称相同,则会进行对应转化。...如果subUser与subUserDto字段名称相同直接配置即可完成(对象类型,包括list) @Data public class UserDto implements Serializable {..., 有其中一个 null, 则会直接返回 null 如一对一转换一样, 属性通过名字来自动匹配。...因此, 名称类型相同不需要进行特殊处理 多个原对象中,有相同名字属性,需要通过 @Mapping 注解来具体指定, 以免出现歧义(不指定会报错)。

56610

试试 MapStruct,优雅对象转换解决方案!

但是像这种的话,需要类型名称都一样才会进行映射,有很多时候,由于不同团队之间使用名词不一样,还是需要很多手动 set/get 等功能。...4、MapStruct使用案例 4.1 属性名称相同 在实现类时候,如果属性名称相同,则会进行对应转化。通过此种方式,我们可以快速编写出转换方法。...如果subUser与subUserDto字段名称相同直接配置即可完成(对象类型,包括list) @Data public class UserDto implements Serializable {..., 有其中一个 null, 则会直接返回 null 如一对一转换一样, 属性通过名字来自动匹配。...因此, 名称类型相同不需要进行特殊处理 多个原对象中,有相同名字属性,需要通过 @Mapping 注解来具体指定, 以免出现歧义(不指定会报错)。

37720

推荐一款 Java 对象映射神器!

Spring 方式,@Mapper 注解 componentModel 属性值 spring,不过应该大多数都用此模式进行开发。...二、自定义属性类型转换方法 一般常用类型字段转换 MapStruct都能替我们完成,但是有一些是我们自定义对象类型MapStruct就不能进行字段转换,这就需要我们编写对应类型转换方法,笔者使用是...示例中User对象config属性是一个JSON字符串,UserVo对象中是List类型,这需要实现JSON字符串与对象互转。...定义好方法之后,MapStruct匹配到合适类型字段,会调用我们自定义转换方法进行转换。...,比如User对象中某个字段不存在与UserVo当中,在编译时会有警告提示,可以在@Mapping中配置 ignore = true,字段较多时,可以直接在@Mapper中设置unmappedTargetPolicy

1.1K20

实体映射最强工具类:MapStruct 真香!

现在有这么个场景,从数据库查询出来了一个user对象(包含id,用户名,密码,手机号,邮箱,角色这些字段一个对应角色对象role(包含id,角色名,角色描述这些字段),现在在controller需要用到...UserRoleDto 目标类,user类源类,调用此方法,会把源类中属性更新到目标类中。...= “customerName”, target = “name”)不是用来指定属性映射,如果两个对象属性名相同是可以省略@Mapping。...如果没有这个注解,toCustomerDto这个方法则不会有customerName name两个属性对应关系。...有时候,在对象转换时候可能会出现这样一个问题,就是源对象中类型是Boolean类型,而目标对象类型是String类型,这种情况可以通过@Mapperuses属性来实现: @Data   @NoArgsConstructor

8.9K12

喜新厌旧,是我本性。今天就宠mapstruct怎么了!

上面的图表明了,代码在target下generated-source目录下生成,这就是我们上面添加插件功劳;代码内容,其实就是一些非判断get、set等。...相同字段相同类型属性,将会无差别的拷贝过去。 如果你bean属性非常多,这个工具会让你代码由几百行,变成几行! 2. 与其他方式比较 那mapstruct有什么优势么?...BeanUtils属性拷贝,在判断不同类型属性,有很多障碍,会歇菜;而mapstruct有非常灵活策略转化方式,自定义性比较强(后面会谈到)。 3....如何将普通类型转化为枚举类型呢?我们只需要提供一个default方法就ok了。mapstruct会判断参数类型返回值,所以说方法名称可以是任何合法值。...假如你在DTO里把a字段改成了b字段mapstruct都贴心你忽略了这些变化。你项目代码并不会提示错误,风险将直接带到运行时。

1.8K10
领券