我有两个映射器,
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
任何提示将不胜感激:-)
当您使用
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);
}
}