项目场景:
在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