Spring Boot統合MapStructによるタイプ変換

7188 ワード

プロジェクトではDO,BO,DTO,VOなどのオブジェクトの相互変換が頻繁に使用されますが、各フィールドget/setメソッドは面倒なので、効率的で汎用的な変換ツールが必要です.
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);

}

  • @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")
  • 三、テストクラス
    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));
        }
    }