Spring Boot統合MapStructによるタイプ変換
7188 ワード
プロジェクトではDO,BO,DTO,VOなどのオブジェクトの相互変換が頻繁に使用されますが、各フィールドget/setメソッドは面倒なので、効率的で汎用的な変換ツールが必要です.
MapStructは、Mapperインタフェースを定義するだけで自動的にこのマッピングインタフェースを実現し、複雑で煩雑なマッピング実装を回避する属性マッピングツールです.MapStruct公式サイトアドレス:http://mapstruct.org/.
本文は主にSpring Boot 2.0とMapStructの統合を実現する.
一、依存を追加する
二、変換Mapperの作成
VOオブジェクト:
DTOオブジェクト:
変換マッパー@org.mapstruct.Mapper(mybatis注記と混同しない)タグクラスを使用して、エンティティタイプ変換インタフェース であることを示します.変換Mapperは、2つの変換方法を提供し、それぞれUserDto--->UserVoおよびUserVo---->UserDto である.componentModel="spring"指定変換MapperをSpring管理に渡し、spring bean注入を実現 imports Java式をインポートするために必要なクラスで、expressionはjava()に含まれる式 を受信します.sourceは変換のソースを表し、targetは変換のターゲットを表す MapStructは、反射 ではなくsetterメソッドとgetterメソッドを最終的に呼び出します.定数に値を割り当てるsource属性を指定できません,@Mapping(target="password",constant="admin") 三、テストクラス
MapStructは、Mapperインタフェースを定義するだけで自動的にこのマッピングインタフェースを実現し、複雑で煩雑なマッピング実装を回避する属性マッピングツールです.MapStruct公式サイトアドレス:http://mapstruct.org/.
本文は主にSpring Boot 2.0とMapStructの統合を実現する.
一、依存を追加する
org.mapstruct
mapstruct
1.3.1.Final
org.mapstruct
mapstruct-processor
1.3.1.Final
二、変換Mapperの作成
VOオブジェクト:
package pers.simon.boot.validator.po;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import pers.simon.boot.validator.annotate.Create;
import pers.simon.boot.validator.annotate.IdCard;
import pers.simon.boot.validator.annotate.Update;
import javax.validation.constraints.*;
import java.util.Date;
/**
* @author simon
* @date 2019/12/10 10:28
*/
@ApiModel(description = " ")
@Data
public class UserVo {
@ApiModelProperty(value = " ID", name = "userId", required = true, example = "123")
@Null(message = " ID ",groups = Create.class)
@NotBlank(message = " ID ",groups = Update.class)
private String userId;
@ApiModelProperty(value = " ", name = "userName", required = true, example = "admin")
@NotBlank(message = " ")
private String userName;
@ApiModelProperty(value = " ", name = "birthday", required = true, example = "2019-11-02")
@Past(message = " ")
@NotNull(message = " ")
private Date birthday;
@ApiModelProperty(value = " ", name = "age", required = true, example = "11", dataType = "int")
@Min(value = 10,message = " 10")
@Max(value = 30,message = " 30")
@NotNull(message = " ")
private Integer age;
@ApiModelProperty(value = " ", name = "email", required = true, example = "[email protected]")
@NotBlank(message = " ")
@Email(message = " ")
private String email;
@ApiModelProperty(value = " ", name = "phone", required = true, example = "12345678900")
@NotNull(message = " ")
@NotBlank(message = " ")
@Pattern(regexp ="^[1][3,4,5,6,7,8,9][0-9]{9}$", message = " ")
@Max(value = 11,message = " 11 ")
@Min(value = 11,message = " 11 ")
private String phone;
@ApiModelProperty(value = " ", name = "idCard", required = true, example = "12345678900")
@NotBlank(message = " ")
@IdCard(message = " ")
private String idCard;
}
DTOオブジェクト:
package pers.simon.boot.validator.po;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import pers.simon.boot.validator.annotate.Create;
import pers.simon.boot.validator.annotate.IdCard;
import pers.simon.boot.validator.annotate.Update;
import javax.validation.constraints.*;
import java.util.Date;
/**
* @author simon
* @date 2019/12/12 16:38
*/
@Data
public class UserDto {
private String userId;
private String userName;
private String password;
private Date birthday;
private Integer age;
private String email;
private String telPhone;
private String idCard;
private Date updateTime;
}
変換マッパー
package pers.simon.boot.validator.convert;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import pers.simon.boot.validator.po.UserDto;
import pers.simon.boot.validator.po.UserVo;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
/**
*
*
* @author simon
* @date 2019/12/12 16:40
*/
@Mapper(componentModel = "spring",imports = {LocalDateTime.class,Date.class, ZoneId.class})// spring
public interface UserConvert {
// Spring
//UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
@Mappings({
@Mapping(target = "updateTime",expression = "java(Date.from( LocalDateTime.now().atZone( ZoneId.systemDefault()).toInstant()))"),
@Mapping(target = "password",constant = "admin")
})
UserDto convert(UserVo userVo);
@Mapping(target = "phone",source = "telPhone")
UserVo convert(UserDto userDto);
}
package pers.simon.boot.validator.convert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import pers.simon.boot.validator.po.UserDto;
import pers.simon.boot.validator.po.UserVo;
import pers.simon.boot.validator.utils.JsonUtil;
import java.util.Date;
/**
* @author simon
* @date 2019/12/12 16:56
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserConvertTest {
private UserDto userDto;
private UserVo userVo;
@Autowired
private UserConvert userConvert;
@Before
public void setUp() throws Exception {
userDto = new UserDto();
userDto.setUserId("1111");
userDto.setUserName("admin");
userDto.setPassword("password");
userDto.setEmail("[email protected]");
userDto.setTelPhone("12345678900");
userDto.setAge(12);
userDto.setBirthday(new Date());
userDto.setIdCard("123321");
userDto.setUpdateTime(new Date());
userVo = new UserVo();
userVo.setUserId("1111");
userVo.setUserName("admin");
userVo.setEmail("[email protected]");
userVo.setAge(12);
userVo.setBirthday(new Date());
userVo.setIdCard("123321");
}
@Test
public void convert() {
UserVo convert = userConvert.convert(userDto);
System.out.println(JsonUtil.toJsonString(convert));
}
@Test
public void testConvert() {
UserDto convert = userConvert.convert(userVo);
System.out.println(JsonUtil.toJsonString(convert));
}
}