MapStruct部分字段不生成 没有自动映射add开头的字段 解决方案(亲测可用)

项目场景:

在Java开发中,采用mapstruct进行实体类之间的转换过程,add开头的字段没有自动映射。


问题描述

貌似这是一个一直以来就有的问题,和实体类lombok的Builder注解有点关系。

如果使用了@Builder注解,并且存在add开头的字段,mapstruct将不会自动映射这个字段。

实体类:

@Data 
@Builder 
@NoArgsConstructor 
@AllArgsConstructor
public class Order implements Serializable {
    private Long addTime;
}

需要转换成DTO:

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderDto implements Serializable {
    private Long addTime;
}

mapstruct方法:

@Mapper
public interface OrderConvert {
    OrderConvert INSTANCE = Mappers.getMapper(OrderConvert.class);

    OrderDto toOrderDto(Order order);

}

原因分析:

可能是add开头的字段采用Builder转换时有某种冲突。


解决方案:

1.采用mapstruct转换时不使用Builder模式创建对象(亲测可行)

注解修改为:@Mapper(builder = @Builder(disableBuilder = true)),注意这个Builder是mapstruct的Builder。

import org.mapstruct.Builder;
@Mapper(builder = @Builder(disableBuilder = true))
public interface OrderConvert {
    OrderConvert INSTANCE = Mappers.getMapper(OrderConvert.class);

    OrderDto toOrderDto(Order order);
}

修改前mapstruct转换实现类:

protected static OrderDto orderToOrderDto(Order order) {
    if (order == null) {
        return null;
    } else {
        OrderDto.OrderDtoBuilder order1 = OrderDto.builder();
        //addTime没有转换
        return order1.build();
    }
}

修改后:

protected OrderDto orderToOrderDto(Order order) {
    if ( order == null ) {
        return null;
    }

    //没有使用Builder,而是直接new一个对象
    OrderDto orderDto = new OrderDto();
    //add开头的字段成功映射
    orderDto.setAddTime( order.getAddTime() );

    return orderDto;
}

2.字段避免使用add开头

3.实体类手动添加add开头字段的set方法(未实测)

 一般来说都采用了lombok的@Data注解,get和set方法并不是显示手写的,可以考虑手动添加出来,感兴趣的同学可以试一下是否可行。

文章参考:
Not mapping field with start at "add" · Issue #3625 · mapstruct/mapstruct · GitHub

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值