Вы проверяете, является ли ваш возвращаемый Optional нулевым, но этого недостаточно, так как Optional переносит либо null, либо ваш объект. Поэтому вам нужно проверить, действительно ли ваш Optional содержит объект пользователя. В вашем случае корректировка кода следующим образом должна работать, проверяя, является ли Optional пустым, а не null.
@GetMapping("/users/{id}")
public EntityModel<User> retrieveUser(@PathVariable int id) {
User user = service.findOne(id);
if(user.isEmpty()) {
throw new UserNotFoundException("id-" + id);
}
//FOLLOWING LINE GIVES ERROR
EntityModel<User> model = new EntityModel<>(user.get());
WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers());
model.add(linkTo.withRel("all-users"));
}
Хорошее руководство по Optionals в Java: https://www.baeldung.com/java-optional