首页
学习
活动
专区
工具
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.8K20

PO VO DTO 转换神器替代BeanUtils 了

实际的映射方法2期望源对象作为参数并返回目标对象。它的名字可以自由选择。 对于源对象和目标对象中具有不同名称的属性,可以使用注释来配置名称。...@Mapping 在需要和可能的情况下,将为源和目标中具有不同类型的属性执行类型转换,例如,属性将从枚举类型转换为字符串。...(限于篇幅,这里不展示自动生成的实现类和验证结果,大家可自行测试) 场景1:属性名称不同、(基本)类型不同 属性名称不同: 在方法上加上 @Mapping 注解,用来映射属性 属性基本类型不同: 基本类型和...= "time3") DemoDto toDemoDto(Demo demo); //MapStruct会将所有匹配到的: //源类型为Date、目标类型为String...,改变字段类型,指定格式化的方式,包括一些日期的默认处理。

10710
  • MapStruct才是王者!【附源码】

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

    2.1K20

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

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

    1.7K10

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

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

    4.9K10

    mapstruct使用的正确姿势

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

    1.3K10

    mapstruct使用的正确姿势

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

    1.6K10

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

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

    2.3K10

    NullException、Token的作用、Mapstruct用法

    1.Java中的空指针异常 空指针的出现: 从空对象中获取 / 修改值,如从数据库获取数据赋值给对象,再从当前对象中取值。...访问或修改空对象的字段 取Null的长度(如数组) 将Null抛出 规避空指针的出现: 在使用对象时,确保将其初始化 声名引用变量时,必须从对象请求方法或字段之前,做判空处理 参考文章:NullException...基于JWT的Token认证机制 一个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

    31710

    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.5K30

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

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

    5.4K70

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

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

    5.1K21

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

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

    3.3K20

    试试这个优雅的方法...

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

    60710

    BeanCopy坑到MapStruct技巧

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

    39410

    你居然不知道MapStruct

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

    2.4K31

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

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

    57820

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

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

    10.9K12
    领券