MapStruct:映射器找不到它所依赖的另一个映射器

问题描述 投票:0回答:1

我有两个映射器,

MapperOne
MapperTwo
,后者取决于前者:

@Mapper(componentModel = "spring")
public interface MapperOne {

    UserDTO convert(User user);
}


@Mapper(componentModel = "spring", uses = MapperOne.class)
public interface MapperTwo {

    @Mapping(target = "loginUser", source = "user")
    UserDTO convert(Login login);
}

MapperTwo
按预期工作...但是让我们假设第三个映射器使用
MapperTwo
,如下所示:

import static org.mapstruct.factory.Mappers.getMapper;

@Mapper(componentModel = "spring")
public interface MapperThree {

    default UserDTO convert(@NonNull final LoginWrapper loginWrapper) {
        final Login login = loginWrapper.getInstance();
        return getMapper(MapperTwo.class).convert(login);
    }
}

MapperThree
不起作用,我总是收到以下错误消息:

java.lang.NullPointerException:
Cannot invoke "com.mytest.mappers.MapperOne.convert(com.mytest.User)" because "this.mapperOne" is null

任何提示将不胜感激:-)

mapstruct
1个回答
0
投票

当您使用

componentModel = "spring"
时,您不应该使用
Mappers.getMapper
。使用通常的
@Autowired
或通过构造函数进行依赖注入应该可以。这可能就是您的案例遇到问题的原因。只需使用
uses = {SomeMapper.class}
就可以了。当类型适用时,Mapstruct 将自动使用“已使用”映射器的映射。

如果您想真正在另一个映射器中编写默认函数,那么您应该像往常一样使用抽象类并自动装配另一个映射器。

@Mapper(componentModel = "spring")
public abstract class MapperThree {

    @Autowired
    MapperTwo mapperTwo;

    default UserDTO convert(@NonNull final LoginWrapper loginWrapper) {
        final Login login = loginWrapper.getInstance();
        return mapperTwo.convert(login);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.