【问题标题】:API (Spring Boot - SwaggerHub Generated) results with 404, despite being mapped properlyAPI(Spring Boot - SwaggerHub 生成)结果为 404,尽管映射正确
【发布时间】:2020-10-05 11:12:03
【问题描述】:

我最近在使用SwaggerHub,并尝试在生成的Spring-Boot api中升级spring-boot版本(1.5.22.RELEASE到2.3.3.RELEASE),因为访问管理(Keycloak)。

将 spring-boot 版本升级到 2.0.1.RELEASE 确实可以解决使用 Keycloak 的问题,但会导致 api 的每个路径出现 404 错误。综上,虽然按照日志映射,但还是无法访问路径。

版本问题:

1.5.22.RELEASE: API-Path 可以访问 - 获取 NoClassDefFoundError: WebServerFactoryCustomizer

2.0.0.RELEASE - 2.0.9.RELEASE: API 路径正在映射,但无法访问 - 启动时 Keycloak 没有错误。

2.1.0.RELEASE - 2.3.3.RELEASE: API 路径未映射 - Keycloak 在启动时没有错误。

这是使用 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()

代码示例:

/getMyConfigurations - 接口:

/**
 * 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 - 控制器:

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);
    }
}

编辑 (05.10.2020): 样式设计以获得更好的概览。

【问题讨论】:

    标签: spring-boot keycloak swagger-ui swaggerhub


    【解决方案1】:

    尝试访问 localhost:8080/TEST/API/1.0.0/getMyConfigurations 上的路径,该路径在 1.5.33.RELEASE 版本中运行。

    似乎 application.properties 上的 server.contextPath 属性在高于 2.x.x.RELEASE 的版本中被忽略。所以事实证明,必须在没有 server.contextPath (localhost:8080/getMyConfigurations) 的情况下调用路径。

    【讨论】:

    猜你喜欢
    • 2021-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 2021-02-15
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多