Reputation: 1645
I have a Spring app that is using Hibernate and the Spring Data JPA's CrudRepository
. Everything seems to work properly if the data that was queried for exists in the database. However, if there is a query that returns no result, the CrudRepository
returns null
and I get a NullPointerException
. So for example http://localhost:8080/api/id=3
if there is a row with id 3 in the database it works fine. If there isn't a row with id of 3 it fails with a:
there was an unexpected error (type=Internal Server Error, status=500)
On the client side and a NullPointerException
on the server side.
What is the proper way of dealing with a simple case of a "No Results" query?
Upvotes: 7
Views: 13165
Reputation: 1
private boolean tableIsEmpty() {
if (tableRepository.findFirstBy() == null) {
return true;
}
return false;
}
Upvotes: 0
Reputation: 48123
Inspect the return value, if it's not null
, return some representation of it as a 200 OK
response. Otherwise, return a 404 Not Found
. In the end, you would have a controller like:
@RequestMapping(...)
public ResponseEntity<?> getOne(...) {
Something something = repository.findOne(...);
if (something == null)
return ResponseEntity.notFound().build();
return ResponseEntity.ok(something);
}
Optional<T>
, as JB Nizet mentioned in the comments. Basically, Optional<T>
is just a container that may or may not hold a value of type T
. You can use this type as the return type of Spring Data JPA methods, something like the following:
public interface SomethingRepository extends CrudRepository<Something, Long> {
Optional<Something> findById(Long id);
}
Then define one exception for 404 Not Found
:
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException {}
If you throw an exception of type NotFoundException
in your controllers, Spring MVC's exception resolver would catch that exception and convert it to a 404 Not Found
HTTP response.
Finally your controller would be like:
@RequestMapping(...)
public Something getOne(...) {
return repository.findById(id).orElseThrow(NotFoundException::new);
}
Optional<T>
support, read here.Optional<T>
, read here.Upvotes: 17
Reputation: 22553
None of the spring crud repository find methods throw an exception if no results are returned. They all return nulls. Since you are getting a null pointer exception on the server side you must be trying to perform an operation on the returned value without checking whether it's null first.
Upvotes: 1