【发布时间】:2020-06-07 16:59:18
【问题描述】:
我正在使用 MapStruct 将数据库实体转换为不可变模型对象。所以不可变对象没有设置器,但 Mapstruct 在映射对象时需要设置器。所以我使用不可变对象构建器创建了一个显式构建器来提供给 Mapstruct。以下是代码中的sn-ps:
@Value.Immutable
@Value.Style(overshadowImplementation = true)
public interface CarModel {
@Nullable String getCarId();
}
@Mapper(uses = ImmutablesBuilderFactory.class)
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "id", target = "carId")
ImmutableCarModel.Builder toModel(CarEntity carEntity);
}
public class ImmutablesBuilderFactory {
public ImmutableCarModel.Builder createCarModelBuilder() {
return ImmutableCarModel.builder();
}
}
以下代码由 Mapstruct 生成:
public class CarMapperImpl implements CarMapper {
@Autowired
private final ImmutablesBuilderFactory immutablesBuilderFactory
@Override
public Builder toModel(CarEntity carEntity) {
if ( carEntity == null ) {
return null;
}
Builder builder = immutablesBuilderFactory.createCarModelBuilder();
if ( carEntity.getId() != null ) {
builder.carId( carEntity.getId() );
}
return builder;
}
}
我能够将实体转换为不可变模型对象,但单元测试为此失败。在单元测试中调用 CarMapper.INSTANCE.toModel(carEntity).build(); 时,它会在 CarMapperImpl 类的代码下方抛出 NPE
Builder builder = immutablesBuilderFactory.createCarModelBuilder();
有人知道这里出了什么问题吗?
【问题讨论】:
-
对可以返回 null 的东西调用任何方法都是有风险的。
toModel的代码显然可以返回null,但是你直接调用.build()而不检查null -
是的,我明白这一点。但是 NPE 被抛出,因为 immutablesBuilderFactory 为空。
-
immutablesBuilderFactory不可能是null。该字段是最终的,并且在类中创建了一个新实例。你确定CarMapperImpl看起来像问题吗? -
是的,你是对的。 ImmutablesBuilderFactory 正在自动装配。修改了问题。
标签: java mapstruct immutables-library