标签: springdoc

Spring 文档 - Open API 3 - 如何为正文设置默认值?

我使用Spring Boot + Spring Data Mongo + Spring REST + Spring HATEOAS来实现 REST 端点。

由于我们传递了超过 5 个查询参数(组织的专有设置,应该不传递),所以我想创建一个 EmployeeDto 类并在 Controller 处传递该类

@GetMapping(value = "/employees", produces = {MediaType.APPLICATION_JSON })
public ResponseEntity<PagedModel<EmployeeModel>> findEmployees(
        EmployeeDto dto,
        @Parameter(hidden=true) String sort,
        @Parameter(hidden=true) String order,
        @Parameter(hidden=true) Pageable pageRequest) {

    // Add needed logic 
    ......
    ......
    ......
    PagedModel<EmployeeModel> model = employeePagedAssembler.toModel(response, employeeAssembler);

    return new ResponseEntity<>(model, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

Swagger UI 显示如下 -

{
  "firstName": "string",
  "lastName": "string",
  "age": 0,
  "languageCd": "string",
  "isActive": "string",
  "email": "string",
  "regionCd": …
Run Code Online (Sandbox Code Playgroud)

spring springdoc springdoc-openui

4
推荐指数
1
解决办法
1万
查看次数

springdoc中的默认响应类

对于某些错误代码,我正在尝试向 API 中的所有端点添加默认错误模型。

我通过阅读以下问题找到了部分解决方案:

这是我为该定制创建的 bean:

    @Bean
    public OpenApiCustomiser customOpenApiCustomiser() {
        return openApi -> {
            openApi.getPaths().values().forEach(pathItem -> pathItem.readOperations().forEach(operation -> {

                Schema sharedErrorSchema = ModelConverters.getInstance()
                        .read(Error.class)
                        .getOrDefault("Error", new Schema());

                MediaType sharedMediaType = new MediaType().schema(sharedErrorSchema);
                Content sharedContent = new Content()
                        .addMediaType(APPLICATION_JSON_VALUE, sharedMediaType);

                ApiResponses apiResponses = operation.getResponses();

                ApiResponse response = new ApiResponse()
                        .description("Unhandled server error")
                        .content(sharedContent);
                apiResponses.addApiResponse("500", response);
            }));
        };
    }
Run Code Online (Sandbox Code Playgroud)

我的 Error 类看起来像:

public class Error {
    private String message;
    private List<ErrorItem> errorItems;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我在 swagger-ui 中打开端点定义之一时,出现以下错误:

Could …

springdoc springdoc-openapi-ui

4
推荐指数
1
解决办法
2386
查看次数

springdoc-openapi-ui OAuth 2.0 带有 PKCE 的授权代码流程

我正在使用 swagger 和 springdoc-openapi-ui-1.4.3

@SecurityRequirement(name = "security_auth")
public class ProductController {}
Run Code Online (Sandbox Code Playgroud)

设置安全架构

@SecurityScheme(name = "security_auth", type = SecuritySchemeType.OAUTH2,
        flows = @OAuthFlows(authorizationCode = @OAuthFlow(
                authorizationUrl = "${springdoc.oAuthFlow.authorizationUrl}"
                , tokenUrl = "${springdoc.oAuthFlow.tokenUrl}",scopes = {
                @OAuthScope(name = "IdentityPortal.API", description = "IdentityPortal.API")})))
public class OpenApiConfig {}
Run Code Online (Sandbox Code Playgroud)

安全配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {// @formatter:off
        http
                .authorizeRequests()
                .antMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html")
                .permitAll()
                .antMatchers(HttpMethod.GET, "/user/info", "/api/foos/**")
                .hasAuthority("SCOPE_read")
                .antMatchers(HttpMethod.POST, "/api/foos")
                .hasAuthority("SCOPE_write")
                .anyRequest()
                .authenticated()
                .and()
                .oauth2ResourceServer()
                .jwt();
    }
}
Run Code Online (Sandbox Code Playgroud)

有依赖关系 …

java spring spring-security spring-boot springdoc

4
推荐指数
1
解决办法
2万
查看次数

如何在 springdoc 中注释 requestBody 的各个元素?

我有一个 spring(启动)服务器,想要使用 springdoc 从注释生成 OpenAPI 规范。

我有一个请求,请求正文中有两个参数。我希望第一个是必需的,第二个是可选的。

@RequestBody(required = {true|false})似乎只将主体中的所有参数设置为(不需要)。@Parameter另一方面,Javadoc说要使用io.swagger.v3.oas.annotations.parameters.RequestBody

这是我的代码,我希望生成一个规范,其中第一个参数是必需的,第二个参数是可选的:

@GetMapping("/fstVector")
public ResponseEntity<Vector> fstV(@RequestBody final Vector v1, @RequestBody(required = false) final Vector v2) {
    return new ResponseEntity<>(v1, HttpStatus.OK);
}

@PostMapping("/fstVector")
public ResponseEntity<Vector> fstVPost(@RequestBody(required = true) final Vector v1, @RequestBody(required = false) final Vector v2) {
    return new ResponseEntity<>(v1, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

然而,生成的规范需要两个参数:

  /pond/fstVector:
    get:
      tags:
      - circle-escape-controller
      operationId: fstV
      parameters:
      - name: v1
        in: query
        required: true
        schema:
          $ref: '#/components/schemas/Vector'
      - name: v2
        in: query
        required: …
Run Code Online (Sandbox Code Playgroud)

spring-boot openapi springdoc springdoc-openapi-ui

4
推荐指数
1
解决办法
1万
查看次数

springdoc-openapi 如何显示字符串数组作为响应

网络上没有关于如何使用 springdocs-openapi 库 (1.5.7) 获取以下输出的好示例。我希望获得以下输出:

[
  "A", "B", "C"
]
Run Code Online (Sandbox Code Playgroud)

这是基于所提供示例的代码。

@Operation(summary = "")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200", description = "OK",
                    content = {@Content(mediaType = "application/json",
                            array = @ArraySchema(schema = @Schema(implementation = String.class)),
                            examples = {@ExampleObject("A"), @ExampleObject("B"), @ExampleObject("C")}
                    )})
Run Code Online (Sandbox Code Playgroud)

这会产生以下输出

[
  "string"
]
Run Code Online (Sandbox Code Playgroud)

上面列出的输出 ["A","B","C"] 如何通过 springdocs-openapi 库实现?

spring-boot springdoc springdoc-ui springdoc-openui springdoc-openapi-ui

4
推荐指数
1
解决办法
7353
查看次数

responseContainer 的 Swagger 2 注解是什么?

我正在使用 Swagger 版本 2.1.9 从 Springfox 迁移到 Springdoc。

因此,必须重写注释,并且我找不到旧 Swagger 注释的等效注释。

我有这个 API 控制器:

@GetMapping
@ApiOperation(value = "Load Building")
@ApiResponses(value = {
   @ApiResponse(code = 200, message = "OK", response = Building.class, responseContainer = "Page")
})
public ResponseEntity<Page<Building>> getBuilding(Pageable building) {
   final Page<Building> building = buildingrepo.findAll(page).map(bw -> mapper.map(bd, Building.class));

return ResponseEntity.ok().body(building);
Run Code Online (Sandbox Code Playgroud)

使用新的 Swagger 注释,必须重新编写它,但我不知道如何将“Building.class”放入响应架构中的可分页中。我不能再使用“responseContainer”

@GetMapping
@Operation(summary = "Load Building")
@ApiResponses(value = {
   @ApiResponse(responseCode = "200", 
                description = "OK",
                content = @Content(schema = @Schema(implementation = Building.class))) // <--- Here i need the …
Run Code Online (Sandbox Code Playgroud)

spring swagger openapi springdoc

4
推荐指数
1
解决办法
2562
查看次数

@ApiModelProperty 到 @Schema

我正在尝试使用以下代码将 springfox 迁移到 springdoc:

import io.swagger.annotations.ApiModelProperty;

@ApiModelProperty(position = 30, required = true, value = "Group value")
Run Code Online (Sandbox Code Playgroud)

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(position = 20, required = false)
Run Code Online (Sandbox Code Playgroud)

但我找不到positionvalue。你知道在 springdoc 中替换它们的正确方法是什么吗?

springfox springdoc springdoc-openapi-ui

4
推荐指数
1
解决办法
8018
查看次数

Spring Boot 3.0.0 和 Springdoc 不兼容?

我有一个准系统的 SpringBoot 项目,pom 文件中包含最新的 Springdoc 依赖项(截至撰写本文时):

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
    <version>1.6.13</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

另外我只有网络启动器依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

它与 Spring Boot 2.7.5 配合良好。在本地计算机上,我可以访问http://localhost:8080/swagger-ui.htmlhttp://localhost:8080/v3/api-docs重定向到 OpenAPI 资源。但是,一旦我将 Spring Boot 版本更改为 3.0.0 并重新启动应用程序,我只能获得404 NOT FOUND上述两个资源。

有没有人找到一种方法可以使 Spring Boot 3.0.0 工作?

java swagger-ui spring-boot openapi springdoc

4
推荐指数
1
解决办法
4116
查看次数

使用 Spring Boot 3 的开放 API 出现 NoClassDefFoundError

我升级到 Spring boot 3.0.7 并尝试让我的 Open API (swagger) 再次工作,具有这些依赖项(根据springdoc):

  <dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
    <version>1.7.0</version>
  </dependency>

  <dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.1.0</version>
  </dependency>
Run Code Online (Sandbox Code Playgroud)

...但是当我构建我的应用程序时,出现以下错误:

java.lang.IllegalStateException: Failed to introspect Class [org.springdoc.webmvc.api.OpenApiWebMvcResource] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@1de0aca6]
Run Code Online (Sandbox Code Playgroud)

...“原因”为:

java.lang.NoClassDefFoundError: javax/servlet/http/HttpServletRequest
Run Code Online (Sandbox Code Playgroud)

当我查看罐子OpenApiWebMvcResource中的内容时,它确实是从而不是org.springdoc:springdoc-openapi-webmvc-core:1.7.0导入的:javaxjakarta

package org.springdoc.webmvc.api;
    
import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Operation;
import java.util.Locale;
import java.util.Optional;
import javax.servlet.http.HttpServletRequest;
...
Run Code Online (Sandbox Code Playgroud)

那么这是一个问题openapi-webmvc-core,还是我接线有问题?

spring-boot openapi springdoc springdoc-openapi-ui

4
推荐指数
1
解决办法
5386
查看次数

springdoc-openapi:如何添加 POST 请求示例?

有以下Controller方法:

    @ApiResponses(value = {@ApiResponse(responseCode = "200")})
    @GetMapping(value = API_URI_PREFIX + PRODUCTS_URI, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseStatus(HttpStatus.OK)
    public Flux<Product> getProducts(@Valid @NotNull PagingAndSorting pagingAndSorting) {
   }
Run Code Online (Sandbox Code Playgroud)

我需要找到一种如何在对象Swagger示例中显示的方法PagingAndSorting

我正在使用springdoc-apiv1.4.3。

java swagger swagger-ui springdoc springdoc-openapi-ui

3
推荐指数
2
解决办法
3170
查看次数