binarylegit
binarylegit

Reputation: 379

How to configure springdoc ui without mapping the root path?

I'm trying to configure springdoc-openapi-ui in a spring web app (non-springboot). In my application I have a controller that is mapped to "/" which conflicts with the Springdoc SwaggerUiHome Controller. I get an error similar to this:

java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'swaggerUiHome' method 'org.springdoc.webmvc.ui.SwaggerUiHome#index() to {GET [/]}: There is already 'loginLogoutController' bean method com.company.MyController#method() mapped.

If I disable my controller which is mapped to '/' then the swagger UI comes up as expected. However, I need to have my controller running in order for my web app to work. Even if I set 'springdoc.swagger-ui.use-root-path=false' (which should be the default anyway) it is still causing an ambiguous mapping error.

Is there any way around this? Any way to disable the default mapping of the SwaggerUiHome.index() to '/'?

Upvotes: 2

Views: 5126

Answers (2)

Kevin Khew
Kevin Khew

Reputation: 501

I'm getting this error if using regular spring framework (not using spring-boot). After dig into the source /springdoc-openapi-starter-webmvc-ui-2.0.2.jar/org.springdoc.webmvc.ui/SwaggerConfig.class

@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(name = SPRINGDOC_USE_ROOT_PATH, havingValue = "true")
@Lazy(false)
SwaggerUiHome swaggerUiHome() {
    return new SwaggerUiHome();
}

Found that String SPRINGDOC_USE_ROOT_PATH = "springdoc.swagger-ui.use-root-path". I guess there maybe a bug that this property is not working for springdoc.swagger-ui.use-root-path=false

Here is my working solution after reading https://www.baeldung.com/spring-requestmapping#4-ambiguous-mapping-error

@GetMapping(value = "/", produces = MediaType.TEXT_HTML_VALUE)
public String index() {
    return "home";
}

Upvotes: 0

brianbro
brianbro

Reputation: 4809

SwaggerUiHome is only invoked if you define: springdoc.swagger-ui.use-root-path=true

To disable it: springdoc.swagger-ui.use-root-path=false

Note that default path of the swagger-ui is not the root path, but: http://server:port/context-path/swagger-ui.html

Upvotes: 2

Related Questions