When to use @RestController vs @RepositoryRestResource

There is a third (and fourth) option that you have not outlined, which is to use either @BasePathAwareController or @RepositoryRestController, depending on whether you are performing entity-specific actions or not.

@RepositoryRestResource is used to set options on the public Repository interface - it will automatically create endpoints as appropriate based on the type of Repository that is being extended (i.e. CrudRepository/PagingAndSortingRepository/etc).

@BasePathAwareController and @RepositoryRestController are used when you want to manually create endpoints, but want to use the Spring Data REST configurations that you have set up.

If you use @RestController, you will create a parallel set of endpoints with different configuration options - i.e. a different message converter, different error handlers, etc - but they will happily coexist (and probably cause confusion).

Specific documentation can be found here.


Ok, so the short story is that you want to use the @RepositoryRestResource since this creates a HATEOAS service with Spring JPA.

As you can see here adding this annotation and linking it to your Pojo you have a fully functional HATEOAS service without having to implement the repository method or the REST service methods

If you add the @RestController then you have to implement each method that you want to expose on your own and also it does not export this to a HATEOAS format.