数据类型转换
自动类型转换
在平常的对象映射中,总会有很多类型不完全一致的情况,例如Integer
转Long
,String
转Integer
或者两个自定义对象之间的转换等。在MapStruct
中定义了一些类型的自动类型转换或者说是隐形类型转换。
例如在上节中提到的基本数据类型和其包装类型之间的转换,String
和数字类型的转换,String
和时间类型的转换等。在@Mapping
注解中还可以自定义转换格式。
numberFormat属性
例如数字类型转String
类型,使用numberFormat
属性。
//Goods.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Goods {
private BigDecimal price;
}
//GoodsDto.java
@Data
public class GoodsDto {
private String price;
}
//GoodsMapper.java
@Mapper
public interface GoodsMapper {
GoodsMapper INSTANCE = Mappers.getMapper(GoodsMapper.class);
@Mapping(source = "price",target = "price",numberFormat = "¥#.00")
GoodsDto toGoodsDto(Goods goods);
}
@Test
void testNumberFormat(){
Goods goods = new Goods(BigDecimal.valueOf(19.9));
GoodsDto goodsDto = GoodsMapper.INSTANCE.toGoodsDto(goods);
log.info("goodsDto:{}",goodsDto);
}
//输出结果:goodsDto:GoodsDto(price=¥19.90)
使用numberFormat
属性本质上就是使用java.text.DecimalFormat
来实现转换的。
下面是MapStruct
生成的toGoodsDto
方法代码
public class GoodsMapperImpl implements GoodsMapper {
@Override
public GoodsDto toGoodsDto(Goods goods) {
if ( goods == null ) {
return null;
}
GoodsDto goodsDto = new GoodsDto();
if ( goods.getPrice() != null ) {
goodsDto.setPrice( createDecimalFormat( "¥#.00" ).format( goods.getPrice() ) );
}
return goodsDto;
}
private DecimalFormat createDecimalFormat( String numberFormat ) {
DecimalFormat df = new DecimalFormat( numberFormat );
df.setParseBigDecimal( true );
return df;
}
}
在@IterableMapping
注解中也有numberFormat
属性,效果跟上面是一样的。
@IterableMapping(numberFormat = "¥#.00")
List<String> toPricesStr(List<Integer> price);
dateFormat属性
时间类型字段例如Date
,LocalDate
,LocalDateTime
等转String
类型,可以使用dateFormat
指定转换格式。
//Goods.java
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Goods {
private BigDecimal price;
private Date createTime;
}
//GoodsDto.java
@Data
public class GoodsDto {
private String price;
private String createTime;
}
//GoodsMapper.java
@Mapper
public interface GoodsMapper {
GoodsMapper INSTANCE = Mappers.getMapper(GoodsMapper.class)