摘要:本文介紹MapStructPlus,也就是MapStruct的加強版,使用注解來簡化手寫對象轉換器。 gitee:https:///easii/mapstruct-plus關鍵注解: @AutoMappers({ @AutoMapper(target = UserDto.class), @AutoMapper(target = UserVO.class) }) // 或者 @AutoMapper(target = UserDto.class) // 使用 User user= Converter.convert(UserDto, User.class);
@AutoMapping(target = "目標字段") @AutoMapping(target = "目標日期字段", dateFormat = "yyyy-MM-dd HH:mm:ss") @AutoMapping(target = "目標數值字段", numberFormat = "$#.00", defaultValue = "100") @AutoMapping(target = "目標字段", expression = "java(java.lang.String.join(",", source.getEducationList()))")
//使用 @AutoMapper(target = User.class, uses = StringToListString.class) //定義 @Component public interface StringToListString { default List<String> stringToListString(String str) { if (str == null) { return Collections.emptyList(); } return Arrays.asList(str.split(",")); } }
<!-- 依賴和插件 --> <dependencies> <dependency> <groupId>io.github.linpeilie</groupId> <artifactId>mapstruct-plus-spring-boot-starter</artifactId> <version>1.5.0</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.7.18</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>1.5.0</version> </path> <!-- Lombok處理器 防止lombok和mapstruct沖突 致使lombok注解失效 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </path> <!-- 最新正式版是 0.2.0(或 0.1.0),而不是跟隨 Lombok 主版本 --> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build>
package org.coffeebeans.entity;
import io.github.linpeilie.annotations.AutoMapper; import io.github.linpeilie.annotations.AutoMapping; import lombok.Builder; import lombok.Data; import org.coffeebeans.config.StringToListString; import java.math.BigDecimal;
/** * <li>ClassName: User </li> * <li>Author: OakWang </li> */ @Data @Builder @AutoMapper(target = UserDto.class, uses = StringToListString.class) public class User {
private Integer id;
@AutoMapping(target = "name") private String username;
@AutoMapping(target = "age", defaultValue = "100") private Integer age;
@AutoMapping(target = "familyAddress") private String address;
@AutoMapping(target = "money", expression = "java(new java.math.BigDecimal(\"3000\"))") private BigDecimal money; }
package org.coffeebeans.entity;
import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import java.math.BigDecimal;
/** * <li>ClassName: UserDto </li> * <li>Author: OakWang </li> */ @Data @AutoMapper(target = User.class) public class UserDto {
private Integer id;
private String name;
private Integer age;
private String familyAddress;
private BigDecimal money; }
package org.coffeebeans;
import org.coffeebeans.entity.User; import org.coffeebeans.entity.UserDto; import org.junit.jupiter.api.Test; import io.github.linpeilie.Converter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; import java.util.Objects;
/** * <li>ClassName: MapstructTest </li> * <li>Author: OakWang </li> */ @SpringBootTest public class MapstructPlusTest {
@Autowired private Converter converter;
@Test public void test() { // 創建一個User對象 List<User> userList = new ArrayList<>(); User user = User.builder().id(1).age(null).username("姓名1").address("地址1").money(null).build(); userList.add(user); // 使用UserTransform將User對象轉換為UserDto對象 UserDto userDto = converter.convert(user, UserDto.class); List<UserDto> userDtos = converter.convert(userList, UserDto.class); // 驗證轉換結果 System.out.println("id屬性是否相等:" + Objects.equals(user.getId(), userDto.getId())); System.out.println("name屬性是否相等:" + Objects.equals(user.getUsername(), userDto.getName())); System.out.println("age屬性是否相等:" + Objects.equals(user.getAge(), userDto.getAge())); System.out.println("address屬性是否相等:" + Objects.equals(user.getAddress(), userDto.getFamilyAddress())); System.out.println("money屬性是否相等:" + Objects.equals(user.getMoney(), userDto.getMoney())); System.out.println("User對象:" + user); System.out.println("UserDto對象:" + userDto); System.out.println("User集合:" + userList); System.out.println("UserDto集合:" + userDtos);
/* 輸出: id屬性是否相等:true name屬性是否相等:true age屬性是否相等:false address屬性是否相等:true money屬性是否相等:false User對象:User(id=1, username=姓名1, age=null, address=地址1, money=null) UserDto對象:UserDto(id=1, name=姓名1, age=100, familyAddress=地址1, money=3000) User集合:[User(id=1, username=姓名1, age=null, address=地址1, money=null)] UserDto集合:[UserDto(id=1, name=姓名1, age=100, familyAddress=地址1, money=3000)] */ } }
總結:以上我們了解了MapStruct的加強版MapStructPlus,通過注解可以更加便捷映射對象,省去了手寫轉換類的步驟,用起來!
|