使用生成 OpenAPI 3.0 规范的 JAX-RS 配置 Spring Boot
您可以使用 Swagger 与 Spring Boot 和 JAX-RS 一起生成 OpenAPI 3.0以下:
- 在
pom.xml 中包含spring-boot-starter-jersey、swagger-core、swagger-annotations 和swagger-jaxrs
- 扩展
ResourceConfig并配置包以扫描JAX-RS注解并注册Swagger的OpenAPIResource.class。
- 使用 Swagger Annotations 注释您的端点和架构。
- 如果您想通过
/swagger-ui.html 访问Swagger,可以选择包含sprindoc-openapi-ui。
1) pom.xml 中的依赖项
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jersey</artifactId>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-annotations</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-core</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.github.classgraph</groupId>
<artifactId>classgraph</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.2.18</version>
</dependency>
当前swagger-version 是2.1.0。
与springdoc-openapi-ui 和swagger-jaxrs2 存在冲突,导致io.github.classgraph 出错,因此必须从swagger-jaxrs2 中排除此库。
2:扩展资源配置
@Component
@ApplicationPath("/api")
@Path("/")
public class JaxRsConfig extends ResourceConfig {
public JaxRsConfig() {
// register resources
packages("com.example.jaxrs.resources");
register(OpenApiResource.class);
}
}
JAX-RS 注释资源必须通过调用packages("com.example.jaxrs.resources") 进行扫描。
小心,不要与 register 函数混淆!
OpenApiResource.class 来自 Swagger 并提供 /openapi.json 端点。
我之所以将/api 用作@ApplicationPath 是因为与springdoc-openapi-ui 一起使用时,@ApplicationPath 设置为“/”时找不到swagger-ui.html 端点。在这种情况下,似乎有些东西被覆盖了。也许有人对此有解释。
3) Swagger 注释
@Schema(name = "Message", description = "This is an object to place a message.")
public class MessageDto {
@Schema(name="Message", required = true)
private String message;
public MessageDto(String message) {
super();
this.message = message;
}
// ... getters and setters
}
4) 配置SpringDoc
默认情况下,您应该可以调用 /swagger-ui.html 打开 Swagger 并浏览您的 OpenAPI 3.0 定义。
由于@ApplicationPath 设置为/api,我们需要通过在application.properties 中设置属性来配置SpringDoc 在哪里查找定义:
springdoc.api-docs.path=/api/openapi.json
您还可以更改 Swagger 的 URL:
springdoc.swagger-ui.path=/swagger-ui.html
其他问题:
将应用程序作为.jar 文件运行时,可能会出现另一个问题:
Spring boot application won't run when trying to run from the jar file
在这种情况下,我找到了一个解决方案,方法是使用像 org.reflections 这样的反射库扫描所有组件,如下所示:
private void scan(String... packages) {
for (String packageName : packages) {
Reflections reflections = new Reflections(packageName);
reflections.getTypesAnnotatedWith(Provider.class).parallelStream().forEach(clazz -> register(clazz));
reflections.getTypesAnnotatedWith(Path.class).parallelStream().forEach(clazz -> register(clazz));
}
}