MapStruct从入门到出门(二)

本文详细介绍了MapStruct在Java应用中的使用,包括自动类型转换、映射引用对象、自定义映射方法、调用其他类的映射方法以及处理方法冲突。MapStruct能够自动生成转换代码,简化类型转换和对象映射过程,支持日期格式和数字格式的定制,以及引用对象的映射。同时,文章展示了如何处理方法冲突和自定义逻辑以满足特定需求。
摘要由CSDN通过智能技术生成

数据类型转换

自动类型转换

在平常的对象映射中,总会有很多类型不完全一致的情况,例如IntegerLongStringInteger或者两个自定义对象之间的转换等。在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属性

时间类型字段例如DateLocalDateLocalDateTime等转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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值