Добрый день.
Поделюсь своими мыслями. А вы уже сами решайте стоит ли вносить правки в ваш код.
1) Судя по этому сниппету:
public void updateUserByInn(List<Users> usersList) {
for (Users dto : usersList) {
Метод принимает Dto.
Ну тут во-первых, класс должен быть в ед. числе Users -> User
Во-вторых, если это Dto, то это должно быть как-то отображено в названии. Например, UserDto, UserUpdateRequest и т.д.
А раз это DTO, то маппинг можно вынести в отдельный метод или даже класс. Можно воспользоваться интерфейсом
Converter <UserDto, User>
, можно подключить либы (ModelMapper, MapStruct).
Если решите использовать ModelMapper, то обратиться внимание на этот вопрос, дабы исключить null параметры:
https://stackoverflow.com/questions/45451025/how-t...
2) Вместо того, чтобы выбрасывать NPЕ можно использовать Optional класс и выбросить кастомное исключение:
Users user = usersRepository.findByInnAndExternalPartnerId(dto.getInn(), dto.getExternalPartnerId()).orElseThrow(UserNotFoundException::new);
Для этого из репозитория ваши методы должны возвращать
Optional<User>
3) Сам метод должен быть назван корректно.
updateUserByInn
обновить юзера по ИНН. А в методе вы обновляете пользователей, а не одного юзера еще и притом обновляете не только по Inn, а по ExternalPartnerId тоже. Значит, метод назван некорректно
Когда вы вынесете дублирующийся код в отдельный метод или даже класс, то код значительно сократиться и станет более читабельным.