I was using SwaggerHub recently and tried to upgrade the spring-boot version (1.5.22.RELEASE to 2.3.3.RELEASE) in the generated Spring-Boot api, because of the access management (Keycloak).
Upgrading spring-boot version to 2.0.1.RELEASE does fix the issues using Keycloak, results in 404 error for every path of the api though. Summarily, no path can be accessed, despite being mapped according to the log.
Issues with the Versions:
1.5.22.RELEASE: API-Path can be accessed - Getting NoClassDefFoundError: WebServerFactoryCustomizer
2.0.0.RELEASE - 2.0.9.RELEASE: API-Paths are being mapped, but no access - No Error with Keycloak at startup.
2.1.0.RELEASE - 2.3.3.RELEASE: API-Paths don't get mapped - No Error with Keycloak at startup.
This is a section of the log using 2.0.1.RELEASE:
2020-10-05 10:46:47.012 INFO 25040 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getIcnByNumber],methods=[GET],produces=[application/json]}" onto public org.springframework.http.ResponseEntity<java.util.List<io.swagger.model.ModelConfiguration>> io.swagger.api.GetIcnByNumberApiController.getIcnByNumber()
2020-10-05 10:46:47.015 INFO 25040 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getMyConfigurations],methods=[GET],produces=[application/json]}" onto public org.springframework.http.ResponseEntity<java.util.List<io.swagger.model.ModelConfiguration>> io.swagger.api.GetMyConfigurationsApiController.callConfiguration()
2020-10-05 10:46:47.017 INFO 25040 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getMyProjects],methods=[GET],produces=[application/json]}" onto public org.springframework.http.ResponseEntity<java.util.List<io.swagger.model.ProjectModel>> io.swagger.api.GetMyProjectsApiController.getMyProjectsGet()
2020-10-05 10:46:47.020 INFO 25040 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getProjectConfiguration/{projectId}],methods=[GET],produces=[application/json]}" onto public org.springframework.http.ResponseEntity<io.swagger.model.ProjectConfiguration> io.swagger.api.GetProjectConfigurationApiController.getProjectConfigurationProjectIdGet(java.lang.String)
2020-10-05 10:46:47.021 INFO 25040 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/getRequestOverview],methods=[GET],produces=[application/json]}" onto public org.springframework.http.ResponseEntity<java.util.List<io.swagger.model.RequestOverview>> io.swagger.api.GetRequestOverviewApiController.getRequestOverview()
Code-Example:
/getMyConfigurations - Interface:
/**
* NOTE: This class is auto generated by the swagger code generator program (3.0.21).
* https://github.com/swagger-api/swagger-codegen
* Do not edit the class manually.
*/
package io.swagger.api;
import io.swagger.model.ModelConfiguration;
import io.swagger.annotations.*;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.CookieValue;
import javax.validation.Valid;
import javax.validation.constraints.*;
import java.util.List;
import java.util.Map;
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2020-09-14T09:55:45.552Z[GMT]")
@Api(value = "getMyConfigurations", description = "the getMyConfigurations API")
public interface GetMyConfigurationsApi {
@ApiOperation(value = "searches inventory", nickname = "callConfiguration", notes = "By passing in the appropriate options, you can search for available inventory in the system ", response = ModelConfiguration.class, responseContainer = "List", tags={ "developers", })
@ApiResponses(value = {
@ApiResponse(code = 200, message = "search results matching criteria", response = ModelConfiguration.class, responseContainer = "List"),
@ApiResponse(code = 400, message = "bad input parameter") })
@RequestMapping(value = "/getMyConfigurations",
produces = { "application/json" },
method = RequestMethod.GET)
ResponseEntity<List<ModelConfiguration>> callConfiguration();
}
/getMyConfigurations - Controller:
package io.swagger.api;
import io.swagger.model.ModelConfiguration;
import io.swagger.model.Originator;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import javax.validation.constraints.*;
import javax.validation.Valid;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@javax.annotation.Generated(value = "io.swagger.codegen.v3.generators.java.SpringCodegen", date = "2020-08-28T09:14:46.542Z[GMT]")
@Controller
public class GetMyConfigurationsApiController implements GetMyConfigurationsApi {
private static final Logger log = LoggerFactory.getLogger(GetMyConfigurationsApiController.class);
private final ObjectMapper objectMapper;
private final HttpServletRequest request;
@org.springframework.beans.factory.annotation.Autowired
public GetMyConfigurationsApiController(ObjectMapper objectMapper, HttpServletRequest request) {
this.objectMapper = objectMapper;
this.request = request;
}
public ResponseEntity<List<ModelConfiguration>> callConfiguration() {
ArrayList<ModelConfiguration> mcList = new ArrayList<>();
return new ResponseEntity<List<ModelConfiguration>>(mcList,HttpStatus.OK);
}
}
EDIT (05.10.2020): Styling for better overview.
Tried to access the path on localhost:8080/TEST/API/1.0.0/getMyConfigurations which was functioning with version 1.5.33.RELEASE.
Seems like the server.contextPath attribute on application.properties is ignored in versions higher than 2.x.x.RELEASE. So it turned out that the path has to be called without server.contextPath (localhost:8080/getMyConfigurations).
Edit:
The property was moved from server.contextPath (or server.context-path) to server.servlet.context-path
as described here
@martinspielmann thank you for the comment.