Erro java.util.NoSuchElementException: No value present

Boa tarde ,

Estou fazendo um Rest para receber um parametro como codigo mas quando não existe no banco de dados me apresenta o erro :slight_smile:
java.util.NoSuchElementException: No value present

O que estou fazendo errado pois tento tratar nulo como Optional

            @GetMapping("/{id}")
public ResponseEntity<Oportunidade> obterOportunidade(@PathVariable Long id) {
	Optional<Oportunidade> oportunidade =  oportunidadeRepository.findById(id);
	
	if (oportunidade.isEmpty()) {
		ResponseEntity.notFound().build();
	}
		
    return ResponseEntity.ok(oportunidade.get());
}

Erro:

java.util.NoSuchElementException: No value present
at java.base/java.util.Optional.get(Optional.java:148) ~[na:na]
at com.algaworks.comercial.controller.OportunidadeController.obterOportunidade(OportunidadeController.java:46) ~[classes/:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
at java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) ~[spring-webmvc-5.1.7.RELEASE.jar:5.1.7.RELEASE]

Errinho de lógica, veja os comentários no código:

@GetMapping("/{id}")
public ResponseEntity<Oportunidade> obterOportunidade(@PathVariable Long id) {
    Optional<Oportunidade> oportunidade =  oportunidadeRepository.findById(id);
    if (oportunidade.isEmpty()) {
        ResponseEntity.notFound().build(); // se dentro deste if não for feito um return ou não for lançado uma exceção
    }
    return ResponseEntity.ok(oportunidade.get()); // então essa linha sempre será executada
}
1 curtida

Obrigado !!!