return specRepo.findByIdentificationType(idType)
.orElse(specRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("...")));
Является причиной.
Java довольно нетерпеливо выполняется и всегда вызывает метод orElse для подготовки на тот случай, если это понадобится.
Порядок вашего выполнения выглядит следующим образом:
specRepo.findByIdentificationType(idType)
orElse
не может быть выполнен, поскольку его аргумент еще не оценен specRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("..."))
- Результат 3 и 4 становится объектом
o
orElse(o)
Вместо использования orElse
следует отдать предпочтение orElseGet
.
return specRepo.findByIdentificationType(idType)
.orElseGet(() -> specRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("...")));
Он будет вызываться только при необходимости.
У нас есть два сценария ios здесь:
specRepo
возвращает непустое значение Необязательно. specRepo
возвращает пустой объект.
В сценарии 1 idType
является действительным identificationType
, следовательно, не id
, поэтому findById
сгенерирует исключение. В сценарии 2 idType
не является допустимым identificationType
, и если оно является допустимым id
, метод должен привести к исключению.
Редактировать:
В то время как этот ответ диагностирует проблема и описывает причину такого поведения, ответ @Abinash Ghosh
обеспечивает самое простое и самое лучшее решение проблемы.
В общем, избегайте использования orElse
. В этом случае добавьте findByIdentificationTypeOrId(String it, String id)
в свой репозиторий.