Java 使用Mapstruct将实体转换为不可变模型对象时,单元测试失败
我使用MapStruct将数据库实体转换为不可变的模型对象。所以不可变对象没有setter,但Mapstruct在映射对象时需要setter。因此,我使用Immutable object builder创建了一个显式生成器,以提供给Mapstruct。以下是代码片段:Java 使用Mapstruct将实体转换为不可变模型对象时,单元测试失败,java,mapstruct,immutables-library,Java,Mapstruct,Immutables Library,我使用MapStruct将数据库实体转换为不可变的模型对象。所以不可变对象没有setter,但Mapstruct在映射对象时需要setter。因此,我使用Immutable object builder创建了一个显式生成器,以提供给Mapstruct。以下是代码片段: @Value.Immutable @Value.Style(overshadowImplementation = true) public interface CarModel { @Nullable String get
@Value.Immutable
@Value.Style(overshadowImplementation = true)
public interface CarModel {
@Nullable String getCarId();
}
以下代码由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())时,将NPE抛出CarMapperImpl类中代码的下面一行代码>单元测试中
有人知道这里出了什么问题吗?这是由于MapStruct配置中的以下属性造成的
-Amapstruct.defaultComponentModel=spring
删除此项后,Mapstruct没有自动连接,并且能够创建ImmutableBuilderFactory的实例。之所以使用NPE,是因为您混合使用了默认组件模型和spring组件模型
Mappers#getMapper
仅用于默认组件模型。使用依赖项注入框架时,您需要使用该框架来访问映射程序。对可能返回null的对象调用任何方法都是有风险的。toModel
的代码显然可以返回null
,但是您可以直接在其上调用.build()
,而无需检查null
是的,我理解。但是正在抛出NPE,因为ImmutableBuilderFactory为null。ImmutableBuilderFactory
不可能为null
。该字段是最终字段,并在类中创建一个新实例。你确定问题中的CarMapperImpl
看起来像吗?是的,你是对的。ImmutableBuilderFactory正在自动连接。修改了问题。问题不在于此,而是库的不正确使用。看看我的答案
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;
}
}
Builder builder = immutablesBuilderFactory.createCarModelBuilder();
-Amapstruct.defaultComponentModel=spring