我正在使用MapStruct将数据库实体转换为Immutable模型对象。所以Immutable对象没有setters,但是Mapstruct在映射对象时需要setters,所以我使用Immutable对象构建器创建了显式构建器提供给Mapstruct。所以我使用Immutable对象构建器创建了一个显式构建器提供给Mapstruct。下面是代码的片段。
@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;
}
}
我能够将一个实体转换为Immutable模型对象,但是单元测试失败了。当调用CarMapperImpl类中的以下一行代码时,它正在抛出NPE。CarMapper.INSTANCE.toModel(carEntity).build();
在单元测试中
Builder builder = immutablesBuilderFactory.createCarModelBuilder();
有谁知道这里出了什么问题吗?
这是由于MapStruct配置中的以下属性造成的。
-Amapstruct.defaultComponentModel=spring
去掉这个之后,Mapstruct没有自动布线,能够创建一个ImmutablesBuilderFactory的实例。
出现NPE的原因是由于你将默认组件模型和spring组件模型混合使用。
该 Mappers#getMapper
仅用于默认的组件模型。当使用依赖注入框架时,你需要使用该框架来获得对映射器的访问。