Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring boot: how to set a common path for multiple RestControllers

I am using spring boot to write an api and I would like to map all my resources behind a common base path (/api in this case). However I don't want to annotate each RestController class to do this (by annotating it with @RequestMapping for example). I have thought about the following solutions but they all have a down side that i would rather not want:

  • Creating a base class (eg ApiRestController) and having all the other RestController inherit this one. This has as disadvantage that @Requestmapping on the class level isn't merged between the base and implementing classes.
  • Annotating all the RestController but this leads to code duplication
  • Changing the server.context-path property. This has as disadvantage that all endpoints will use this base path. Even the endpoints exposed by the actuator project.
  • Using a custom DispatcherServlet and ServletRegistrationBean. But this seems to have the same effect as changing the server.context-path.

So does anyone know how to do this without the disadvantages the solutions have that i summed. The project will only expose a REST-based backend and will not server any static content (don't know if this influences the possible solutions). The Restcontrollers are also divided over multiple packages.

Thanks.

like image 334
Geert Olaerts Avatar asked Nov 14 '15 18:11

Geert Olaerts


People also ask

Can 2 controllers have same request mapping?

You cannot. A URL can only be mapped to a single controller. It has to be unique.

How do you specify prefix for all controllers in spring boot?

Then, we only need to apply the annotation to each controller we want to prefix: @Controller @ApiPrefixController public class SomeController { @RequestMapping("/users") @ReponseBody public String getAll(){ // ... } }

What is the use of @RestController in spring boot?

The RestController allows to handle all REST APIs such as GET, POST, Delete, PUT requests. Spring Initializr is a web-based tool using which we can easily generate the structure of the Spring Boot project. It also provides various different features for the projects expressed in a metadata model.


1 Answers

Why don't you put @RequestMapping("/api") on all RestControllers?

@RestController
@RequestMapping("/api")
public class UserApi {
    @RequestMapping("/user")
    public String user() {
        ...
    }
}
like image 121
Rod Lima Avatar answered Sep 21 '22 06:09

Rod Lima