Mapstruct Plus 是对 Mapstruct 框架的一个增强,只做增强,不做修改,可以通过一个注解,自动生成两个类之间的转换操作,省略了 Mapstruct 定义接口的操作,使 Java 类型转换更加便捷、优雅。
目标:做最简单、最强大的类型转换工具
下面演示如何使用 MapStruct Plus 来映射两个对象。
假设有两个类 UserDto
和 User
,分别表示数据层对象和业务层对象:
UserDto
public class UserDto {
private String username;
private int age;
private boolean young;
// getter、setter、toString、equals、hashCode
}
User
public class User {
private String username;
private int age;
private boolean young;
// getter、setter、toString、equals、hashCode
}
引入 mapstruct-plus-spring-boot-starter
依赖:
<properties>
<mapstruct-plus.version>1.1.3</mapstruct-plus.version>
</properties>
<dependencies>
<dependency>
<groupId>io.github.linpeilie</groupId>
<artifactId>mapstruct-plus-spring-boot-starter</artifactId>
<version>${mapstruct-plus.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>io.github.linpeilie</groupId>
<artifactId>mapstruct-plus-processor</artifactId>
<version>${mapstruct-plus.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
在 User
或者 UserDto
上面增加注解 —— @AutoMapper
,并设置 targetType
为对方类。
例如:
@AutoMapper(target = UserDto.class)
public class User {
// ...
}
@SpringBootTest
public class QuickStartTest {
@Autowired
private Converter converter;
@Test
public void test() {
User user = new User();
user.setUsername("jack");
user.setAge(23);
user.setYoung(false);
UserDto userDto = converter.convert(user, UserDto.class);
System.out.println(userDto); // UserDto{username='jack', age=23, young=false}
assert user.getUsername().equals(userDto.getUsername());
assert user.getAge() == userDto.getAge();
assert user.isYoung() == userDto.isYoung();
User newUser = converter.convert(userDto, User.class);
System.out.println(newUser); // User{username='jack', age=23, young=false}
assert user.getUsername().equals(newUser.getUsername());
assert user.getAge() == newUser.getAge();
assert user.isYoung() == newUser.isYoung();
}
}
引入依赖后,使用 Mapstruct Plus 步骤非常简单。
AutoMapper
注解Converter
实例,调用 convert
方法即可痛点 在Java开发中我们要面对各种各样的类型转换问题,尤其是从命令行获取的用户参数、从HttpRequest获取的Parameter等等,这些参数类型多种多样,我们怎么去转换他们呢?常用的办法是先整成String,然后调用XXX.parseXXX方法,还要承受转换失败的风险,不得不加一层try catch,这个小小的过程混迹在业务代码中会显得非常难看和臃肿。 Convert类 Convert类可
Rust 在基本类型之间没有提供隐式类型转换(强制类型转换)(implicit type conversion,coercion )。不过使用 as 关键字进行显式类型转换(explict type conversion,casting)。 一般来说,Rust 的整型类型的转换规则遵循 C 语言的惯例,除了那些在 C 语言是未定义行为的情况。在 Rust 中,所有的整型类型转换的行为都得到了很好的
类型转换可以判断实例的类型,也可以将该实例在其所在的类层次中视为其父类或子类的实例。 Swift 中类型转换的实现为 is 和 as 操作符。这两个操作符使用了一种简单传神的方式来检查一个值的类型或将某个值转换为另一种类型。 如同协议实现的检查(此处应有链接)中描述的那样,你还可以使用类型转换来检查类型是否遵循某个协议。 为类型转换定义类层次 你可以在类及其子类层次中使用类型转换来判断特定类实例的
String可以与整型和浮点型互相转换。 整形 String转Int String s("1234"); long value = s.toInt(); Int转String String s(1234); 浮点型 String转Float String s("1234.56"); double value = s.toFloat(); Float转String String s(1234.
Variant对象提供的toXXX系列函数可以将标量(Scalar)变量转换为其他类型。Zend字符串、数组、对象可直接使用构造方法进行转换,但必须保证传入的Variant对象必须为该类型,否则底层会抛出致命错误。 转为整型 long value = var.toInt(); 转为浮点型 double value = var.toFloat(); 转为布尔型 bool value = var.
本页包含内容: 定义一个类层次作为例子 检查类型 向下转型(Downcasting) Any和AnyObject的类型转换 类型转换可以判断实例的类型,也可以将实例看做是其父类或者子类的实例。 类型转换在 Swift 中使用is 和 as操作符实现。这两个操作符提供了一种简单达意的方式去检查值的类型或者转换它的类型。 你也可以用来检查一个类是否实现了某个协议,就像在 Checking for Pr
大多数情况下,运算符和函数会自动将赋予它们的值转换为正确的类型。 比如,alert 会自动将任何值都转换为字符串以进行显示。算术运算符会将值转换为数字。 在某些情况下,我们需要将值显式地转换为我们期望的类型。对象还未纳入讨论中 在本章中,我们不会讨论 object 类型。目前,我们将只学习原始类型。 之后,在我们学习完 object 类型后,我们会在 对象 — 原始值转换 一章中学习对象 — 原始
JavaScript 是弱类型语言,所以会在任何可能的情况下应用强制类型转换。 // 下面的比较结果是:true new Number(10) == 10; // Number.toString() 返回的字符串被再次转换为数字 10 == '10'; // 字符串被转换为数字 10 == '+10 '; // 同上 10 == '010';