功能介绍
方便dto之间的转换,提供了两种方式,对于不同属性名和相同属性名均提供了方法
项目使用
针对controller层和service层的对象转换上可方便使用,以下是使用步骤:
-
pom文件
增加依赖<dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>1.2.0.CR1</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>1.2.0.CR1</version> <scope>provided</scope> </dependency>
-
注解componentModel参数值:
default: 这是默认的情况,mapstruct不使用任何组件类型, 可以通过Mappers.getMapper(Class)方式获取自动生成的实例对象。
cdi: the generated mapper is an application-scoped CDI bean and can be retrieved via @Inject
spring: 生成的实现类上面会自动添加一个@Component注解,可以通过Spring的 @Autowired方式进行注入
jsr330: 生成的实现类上会添加@javax.inject.Named 和@Singleton注解,可以通过 @Inject注解获取。
-
常用用法:
对于相同属性名,创建一个接口,保证对应字段名相同即可
@Mapper(componentModel = "spring")
public interface TestConverter {
/**
* 根据 testVo对象创建 TestDto 对象
* @param testVo
* @return
*/
TestDto from(TestVo testVo);
}
对于不同属性名,则需要对应字段映射
@Mapper(componentModel = "spring")
public interface UserConver {
@Mappings({
@Mapping(source = "id",target = "idUser"),
@Mapping(source = "title",target = "title"),
@Mapping(source = "pricez",target = "pricez")
})
UserVo item2Dto(User user);
}
4.现象:
在编译完成后,在target包class文件中相同位置中会生成对应的impl文件
使用举例
CarVo定义:
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class CarDto implements Serializable {
private String carNo;
private int carId;
private String carType;
private List<String> catInfos;
private long car4;
private String car5;
}
CarVo定义:
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class CarVo implements Serializable {
private String carNo;
private int carId;
private String carType;
private List<String> catInfos;
private String car1;
private int car2;
private boolean car3;
}
使用接口定义
import com.dx.test.common.vo.CarDto;
import com.dx.test.common.vo.CarVo;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")
public interface CarChange {
CarDto from(CarVo carVo);
}
调用(我使用的JUnit单元测试)
@Autowired
private CarChange carChange;
@Test
public void test17() {
CarVo carVo = new CarVo();
List<String> infos = new ArrayList<>();
infos.add("wer");
infos.add("wfg");
carVo.setCarNo("123");
carVo.setCarId(123);
carVo.setCarType("wer");
carVo.setCatInfos(infos);
carVo.setCar1("sdf");
carVo.setCar2(1);
carVo.setCar3(true);
System.out.println(carChange.from(carVo));
}
结果展示:
自动生成的impl类
例子到这里基本结束,对于第二种需要映射属性的,只需要在接口上加上对应映射即可:
import com.sf.dx.test.common.vo.CarDto;
import com.sf.dx.test.common.vo.CarVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
@Mapper(componentModel = "spring")
public interface CarChange {
@Mappings({
@Mapping(source = "car1",target = "car5"),
@Mapping(source = "car2",target = "car4")
})
CarDto from(CarVo carVo);
}
这里补充说明:这里的mapping可以仅映射字段名对不上的,字段名能对上的会自动映射。