一、maven依赖
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.6.0</version>
</dependency>
二、创建对象
@Data
public class UserDto {
private Long id;
private String username;
private String address;
private String comment;
private Date birthday;
private Integer gender;
private Date createTime;
private Date updateTime;
private String createUser;
private String updateUser;
private Integer yn;
private AddressInfo addressInfo;
}
@Getter
@Setter
public class User {
private String name;
private Integer gender;
private Integer age;
private AddressInfo addressInfo;
private Map<String, String> extents;
private Integer isDefault;
private String birthday;
}
@Data
public class AddressInfo implements Serializable {
private static final long serialVersionUID = 1398783661313031605L;
private String provinceNo;
private String provinceName;
private String cityNo;
private String cityName;
private String countyNo;
private String countyName;
private String townNo;
private String townName;
private String detailAddress;
private String fullAddress;
private AgreementInfo agreementInfo;
}
@Setter
@Getter
public class AgreementInfo implements Serializable {
private static final long serialVersionUID = -5707331500296054799L;
private String agreementType;
}
三、创建转换对象接口
@Mapper(componentModel = "spring")
public interface CommonConvertMapper {
CommonConvertMapper INSTANCE = Mappers.getMapper(CommonConvertMapper.class);
@Mappings({
@Mapping(source = "username", target = "name"),
@Mapping(source = "address", target = "addressInfo.fullAddress"),
@Mapping(target = "addressInfo.provinceName", expression = "java(userDto.getUsername() + '&' + userDto.getAddress())"),
@Mapping(source = "birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(constant = "3", target = "isDefault"),
})
User convertUserDtoToUser(UserDto userDto);
@Mappings({
@Mapping(target = "createUser", expression = "java(java.util.UUID.randomUUID().toString())"),
@Mapping(source = "birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(target = "comment", expression = "java(map.get(\"username\") + '&' + map.get(\"address\"))"),
@Mapping(target = "addressInfo", expression = "java(com.alibaba.fastjson.JSON.parseObject(map.get(\"addressInfo\"), com.summer.toolkit.dto.AddressInfo.class))"),
})
UserDto convertMapToUserDto(Map<String, String> map);
@Mappings({
@Mapping(source = "username", target = "name"),
@Mapping(target = "addressInfo", expression = "java(convertAddressInfo(userDto.getAddressInfo()))"),
@Mapping(source = "birthday", target = "birthday", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping(constant = "3", target = "isDefault"),
})
User convertUserDtoToUserDeep(UserDto userDto);
@Mappings({
@Mapping(target = "agreementInfo", expression = "java(convertAgreementInfo(addressInfo.getAgreementInfo()))"),
})
AddressInfo convertAddressInfo(AddressInfo addressInfo);
@Mappings({})
AgreementInfo convertAgreementInfo(AgreementInfo agreementInfo);
}
四、测试方法
@Slf4j
@ExtendWith(MockitoExtension.class)
@EnabledIfEnvironmentVariable(named = "DEBUG", matches = "true")
public class CommonConvertMapperTest {
@Test
public void testConvertUserDtoToUser() {
UserDto userDto = new UserDto();
userDto.setUsername("小明");
userDto.setGender(1);
userDto.setAddress("北京市大兴区亦庄经济开发区");
userDto.setBirthday(new Date());
User user = CommonConvertMapper.INSTANCE.convertUserDtoToUser(userDto);
log.info("结果:{}", JSON.toJSONString(user));
}
@Test
public void testConvertMapToUserDto() {
Map<String, String> map = new HashMap<>(16);
map.put("id", "10");
map.put("username", "小明");
map.put("address", "北京市大兴区亦庄经济开发区");
map.put("createUser", "小明");
map.put("birthday", DateUtils.format(new Date()));
UserDto userDto = CommonConvertMapper.INSTANCE.convertMapToUserDto(map);
log.info("结果:{}", JSON.toJSONString(userDto));
}
@Test
@DisplayName("对象转换")
@EnabledOnOs(OS.WINDOWS)
public void testConvertUserDtoToUserDeep() {
UserDto userDto = new UserDto();
userDto.setUsername("小明");
userDto.setGender(1);
userDto.setAddress("北京市大兴区亦庄经济开发区");
userDto.setBirthday(new Date());
userDto.setId(1L);
AddressInfo addressInfo = new AddressInfo();
addressInfo.setDetailAddress("北京市大兴区亦庄经济开发区");
userDto.setAddressInfo(addressInfo);
AgreementInfo agreementInfo = new AgreementInfo();
agreementInfo.setAgreementId("123");
addressInfo.setAgreementInfo(agreementInfo);
User user = CommonConvertMapper.INSTANCE.convertUserDtoToUserDeep(userDto);
user.getAddressInfo().setDetailAddress("河北省");
log.info("结果:{}", JSON.toJSONString(user));
log.debug("结果:{}", JSON.toJSONString(user));
}
}