Spring Security OpenAPI生成器Spring:端点控制器方法的自定义参数,模型的连接注解

bcs8qyzn  于 2023-05-22  发布在  Spring
关注(0)|答案(1)|浏览(204)

首先,我对Java和Spring生态系统相对较新。
顺便说一句,我使用OpenAPI来描述我的REST API。该应用程序使用Sping Boot 3和Security 6。我想自动生成尽可能多的代码。示例端点规范:

/cashcards:
  post:
      summary: Create a new cash card.
      tags:
        - demo
      responses:
        '201':
          description: Created
          headers:
            Location:
              schema:
                type: string
              description: Created cashcard location.
      operationId: postCashCard
      description: Create a new cash card.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CashCardDetail'
            examples:
              Example 1:
                value:
                  amount: '100.10'
                  owner: sarah
        description: A cash card without ID
      security:
        - OAuth2-Authorization:
            - 'write:cashcards'

现在我正在使用OpenAPI generator生成API和模型类。然后覆盖控制器类中特定端点的API方法并在那里编写逻辑。
我正面临一些障碍。由于我使用的是spring Boot 和spring security,我希望我的一些控制器方法具有以下参数

default ResponseEntity<Void> postCashCard(
        @Parameter(name = "CashCardDetail", description = "A cash card without ID") @Valid @RequestBody(required = false) CashCardDetail cashCardDetail
    )

但我希望控制器就像

@Override
@PreAuthorize("hasAuthority('SCOPE_write:cashcards')")
    public ResponseEntity<Void> postCashCard(@RequestBody CashCard newCashCardRequest, UriComponentsBuilder ubc,
            Principal principal)

当然,由于方法参数不一样,我不能覆盖自动生成的API方法。在API参数中添加UriComponentsBuilderPrincipal没有意义。
同样,我将使用spring data jpa。使用像@OneToMany@JoinColumn这样的注解似乎也很困难。
如果有人在实际生产用例中使用openapi生成器,我想知道这些问题是如何解决的。如何自动生成与OpenAPI定义无关的方法参数?如何将模型字段注解等添加到自动生成的代码中?
如果自动发电机的目标是完全不同的,我试图实现,我想听到的。现在我必须手动添加@PostAuthrize,即使范围/安全方案在OpenAPI中定义。不使用生成器手动编写代码似乎更快。
感谢您的耐心等待。

c8ib6hqw

c8ib6hqw1#

您不修改控制器方法的参数。在这种情况下,这些额外的参数可以在方法(或周围的类)的代码中读取,如下所示:
类级字段

UriComponentsBuilder ubc = UriComponentsBuilder.newInstance()
      .scheme("https").host("www.altron.com").path("/users");

控制器内法

Principal principal = (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

相关问题