Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Mapstruct将实体转换为不可变模型对象时,单元测试失败_Java_Mapstruct_Immutables Library - Fatal编程技术网

Java 使用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

我使用MapStruct将数据库实体转换为不可变的模型对象。所以不可变对象没有setter,但Mapstruct在映射对象时需要setter。因此,我使用Immutable object builder创建了一个显式生成器,以提供给Mapstruct。以下是代码片段:

@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