Why does getOne(…) on a Spring Data repository not throw an EntityNotFoundException?
This is due to the way JPA specifies EntityManager.getReference(…)
to work. It's supposed to return a proxy that will either resolve the object to be returned on the first access of a property or throw the contained exception eventually.
The easiest way to work around this is to simply use findOne(…)
instead, like this Optional.ofNullable(repository.findOne(…))
. findOne(…)
will return null
in case no result is found.
A more advanced way of resolving this is to make the repository return Optional
instances directly. This can be achieved by creating a custom base repository interface using Optional<T>
as return type for the find…
-methods.
interface BaseRepository<T, ID extends Serializable> extends Repository<T, ID> {
Optional<T> findOne(ID id);
// declare additional methods if needed
}
interface YourRepository extends BaseRepository<DomainClass, Long> { … }
Find a complete example of this in the Spring Data examples repository.
In Spring @Repository
classes, the getOne(id)
method doesn't always verify existence until the object is queried (by calling entity.getId()
or something) so it's no-such-entity exception may be delayed. To validate right away, use findById(id)
instead (which returns an Optional<EntityType>
which will be empty if the entity with that id doesn't exist).
This is how it worked for me
public User findUserById(Long id) {
return userRepository.findById(id).orElse(null);
}