Buscamos por diferentes espacios y así brindarte la respuesta a tu duda, en caso de dificultades déjanos la pregunta y te contestaremos con mucho gusto, porque estamos para ayudarte.
Solución:
return specRepo.findByIdentificationType(idType)
.orElse(specRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("...")));
Es la razón.
Java es bastante entusiasta en la ejecución y siempre llama al método orElse para prepararse en caso de que lo necesite.
El orden de su ejecución es de alguna manera:
specRepo.findByIdentificationType(idType)
orElse
no se puede ejecutar porque su argumento aún no se ha evaluadospecRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("..."))
- El resultado de 3 y 4 se convierte en un objeto.
o
orElse(o)
En lugar de usar orElse
uno debe preferir orElseGet
.
return specRepo.findByIdentificationType(idType)
.orElseGet(() -> specRepo.findById(idType)
.orElseThrow(() -> new ResourceNotFoundException("...")));
Sólo se llamará cuando sea necesario.
Aquí tenemos dos escenarios:
specRepo
devuelve un Opcional no vacío.specRepo
devuelve un objeto vacío.
En el escenario 1, idType
es un valido identificationType
por lo tanto no es un id
entonces el findById
lanzará una excepción. En el escenario 2, idType
no es valido identificationType
y si es legal id
el método debería resultar en el lanzamiento de una excepción.
Editar:
Si bien esta responde diagnostica el problema y describe cuál es la razón de tal comportamiento, @Abinash Ghosh
answer proporciona la solución más simple e imo mejor del problema.
En general, evite usar orElse
. En este caso, agregue el findByIdentificationTypeOrId(String it, String id)
a su repositorio.
@xenteros tiene razón, ese es el problema. Puedes usar findByIdentificationTypeOrId
para obtener datos en una consulta
return specRepo.findByIdentifcationTypeOrId(idType, idType)
.orElseThrow(() -> new ResourceNotFoundException("...")));
y repositorio como
@Repository
public interface IdentificationSpecRepository extends CrudRepository
Optional findByIdentificationTypeOrId(String identificationType, String id);
Si piensas que ha resultado de ayuda nuestro post, nos gustaría que lo compartas con más juniors de esta manera contrubuyes a extender nuestro contenido.