Использую 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, либо пустой конструктор требует