@sltay

Как смаппить ДТО в сущнсоть где есть вложннная дто?

Использую Mapstruct для маппинга сущнсотей в дто. У меня есть SensorDTO в которой хранится еще одно дто - данные владельца датчика.
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class SensorDTO {
    private UserDTO owner;
    private String name;
    private int critical;
}


и есть маппер на это ДТО
@Mapper(uses = {UserMapper.class})
public interface SensorMapper {
    SensorMapper INSTANCE = Mappers.getMapper(SensorMapper.class);

    Sensor map(SensorDTO dto);
    SensorDTO map(Sensor sensor);
}

К ней написал такую реализацию:
@Component
public class UserMapperImpl implements UserMapper {
    @Autowired
    private  UserService service;

    @Override
    public UserDTO map(User user) {
        return new UserDTO(user.getName());
    }

    @Override
    public User map(UserDTO userDTO) {
        return userDTO == null ?
                null : service.findUserByLogin(userDTO.getName()).orElse(null);
    }
}

Проблема в том, что мне нужно как-то внедрить сервис, что бы найти пользователя по его логину из ДТО, но при попытке заинжектить сервис как поле я получаю NPE, а если в конструкторе, то Mapstruct ругается что не найден пустой конструктор
Как мне реализовать такой маппинг?
P.s. пытался делать через resolver
@Component
public class UserResolver {
    @Autowired
    UserService userService;

    @ObjectFactory
    public User resolve(UserDTO dto, @TargetType Class<User> type) {
        //System.err.println("UserResolver#resolve");
        return userService.findUserByLogin(dto.getName()).orElse(null);
    }
}

И автоматическую генерацию маппера, но спотыкаюсь о ту же проблему, либо NPE, либо пустой конструктор требует
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы