【问题标题】:Openapi Generator. How to generate method with HttpServletResponse as parameter?Openapi 生成器。如何生成以 HttpServletResponse 作为参数的方法?
【发布时间】:2022-06-15 19:38:16
【问题描述】:

每个人。

我使用“设计优先”的策略。我描述规范。 其中一种方法接受 HttpServletResponse 作为参数。 但我不知道如何在我的 .yaml-fle 中正确描述它。

我想写的:

/api/method:
    get:
      tags:
        - XXXController
      summary: ~
      description: ~
      operationId: doSomething
      parameters:
        - description: HttpServletResponse
          in: query
          name: response
          required: true
          schema:
            $ref: '#/components/schemas/HttpServletResponse'

同时,我在 build.gradle 中添加了 ImportMappings:

importMappings = [
                     HttpServletResponse: "javax.servlet.http.HttpServletResponse"
    ]

它不起作用。

如果我放置在“组件”部分中描述的 $ref “真实”组件 - 就可以了。

但它不适用于外部类(在 importMappings 中映射)

我需要你的帮助

我希望得到这样的方法

public void method(HttpServletResponse response);

但我收到一个错误:

Errors: 
  -attribute paths.'/method/l'(get).parameters.[response].schemas.#/components/schemas/HttpServletResponse is missing

【问题讨论】:

    标签: spring-boot gradle openapi spring-restcontroller openapi-generator


    【解决方案1】:

    HttpServletResponse 不是您想要添加到 OpenAPI 描述中的内容。

    通过 http 调用您的 api 的人会对此感到非常困惑,并且无法提供特定于框架的 java 类作为参数。

    HttpServletResponse 是您从 Spring Boot 应用程序中获得的东西,例如就像你上面的例子一样。这是一个实现细节。

    由于 HttpServletResponse 它不是 API 的一部分,并且您无法直接控制生成的 api 方法的签名,因此生成器必须提供代码才能访问 HttpServletResponse

    我不是 openapi-generator 专家,但使用一个小型测试项目,它会生成如下代码:

    @Controller
    @RequestMapping("${openapi.sample.base-path:}")
    public class FooApiController implements FooApi {
    
        private final NativeWebRequest request;
    
        @org.springframework.beans.factory.annotation.Autowired
        public FooApiController(NativeWebRequest request) {
            this.request = request;
        }
    
        @Override
        public Optional<NativeWebRequest> getRequest() {
            return Optional.ofNullable(request);
        }
    }
    

    然后您可以使用端点实现中的NativeRequest 来获取响应对象。

    ...

    openapi-processor(我是作者)是一个替代生成器,它使用不同的方式提供对HttpServletResponse 的访问。

    有一个 api:

    openapi: 3.0.2
    info:
      title: test additional endpoint parameters
      version: 1.0.0
    
    paths:
      /foo:
        get:
          parameters:
            - name: foo
              description: query, required
              in: query
              required: true
              schema:
                type: string
          responses:
            '204':
              description: empty
    

    还有几行额外的配置:

    # snippet from the yaml configuration
    
      paths:
        /foo:
          parameters:
            - add: response => javax.servlet.http.HttpServletResponse
    

    它将生成一个带有额外HttpServletResponse参数的(接口)方法:

    @GetMapping(path = "/foo")
    void getFoo(@RequestParam(name = "foo") String foo, HttpServletResponse response);
    

    【讨论】:

      【解决方案2】:

      通过使用@autowired 注入 HttpServletResponse 解决的问题,而不是作为方法参数

      【讨论】:

        猜你喜欢
        • 2021-06-02
        • 2021-07-12
        • 2021-12-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-07
        • 2020-02-17
        • 1970-01-01
        相关资源
        最近更新 更多