I\'m working on a weird issue, I was doing integration testing, calling my controller to get an object from database that doesn\'t exist.
public Optional<
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 nullin 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);
}