为 Spring Web API 使用 Quarkus 扩展
指南
摘要
前言 复制链接链接已复制到粘贴板!
作为应用程序开发人员,您可以使用 Spring Web 注解来定义 Quarkus 应用程序中的 RESTful 服务。
对红帽文档提供反馈 复制链接链接已复制到粘贴板!
我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。
您必须有一个红帽帐户并登录到客户门户网站。
要从客户门户网站提交文档反馈,请执行以下操作:
- 选择 Multi-page HTML 格式。
- 点文档右上角的 反馈 按钮。
- 突出显示您要提供反馈的文本部分。
- 点高亮文本旁的添加反馈对话框。
- 在页面右侧的文本框中输入您的反馈,然后单击 Submit。
每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。
感谢您的宝贵反馈。
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
Quarkus 提供了一个兼容层,用于使用 Spring Web 中的注解为应用程序定义 REST 端点。这个功能由 quarkus-spring-web 扩展提供,作为使用默认的 JAX-RS 注解来定义 REST 端点的替代方法。
当您启动应用程序时,Quarkus 中的 Spring 兼容性层不会启动 Spring 应用上下文或执行任何由 Spring 提供的基础架构类(如 org.springframework.beans.factory.config.BeanPostProcessor)。Quarkus 只能从 Spring 类和注解读取元数据,并解析特定于 Spring 的用户代码方法返回类型和参数类型。但是,当您将属于 Spring Framework 一部分的任意库添加到 Quarkus 应用程序时,这些库将无法正常工作,因为 Quarkus 并不是设计为使用它们。
您可以按照本指南并创建将 Quarkus 扩展用于 Spring Web API 的示例,或者您可以下载并查看已完成的示例。要查看完成的 Quarkus Spring Web 示例,请将其下载为 存档,或克隆 Quarkus 示例 Git 存储库。您可以在 spring-web-quickstart 目录中找到 Spring Web 示例。
第 1 章 先决条件 复制链接链接已复制到粘贴板!
-
安装 OpenJDK 11 并将
JAVA_HOME环境变量设置为与安装 OpenJDK 所在的目录的路径匹配。 - 已安装 Apache Maven 3.6.2 或更高版本。
第 2 章 创建 Spring Web 示例 Maven 项目 复制链接链接已复制到粘贴板!
您可以使用 Quarkus Maven 插件来创建新的 Quarkus 项目,自动生成 REST 控制器类,并使用一个命令添加 quarkus-spring-web 依赖项。您还可以更新 pom.xml 文件并手动创建 REST 控制器类和 REST 控制器测试类。
流程
使用本节中显示的方法之一来创建 Quarkus Spring Web 示例 Maven 项目:
如果您没有 Maven 项目,您可以使用 Quarkus Maven 插件创建新的 Maven 项目。输入以下命令:
- 创建 Maven 项目目录结构
-
创建
org.acme.spring.web.GreetingController类,为您的应用程序定义 REST 端点 导入
quarkus-spring-web扩展您必须将 &
lt;project_name> 替换为包含项目文件的目录的名称。mvn io.quarkus:quarkus-maven-plugin:1.11.7.Final-redhat-00009:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=<project_name> \ -DclassName="org.acme.spring.web.GreetingController" \ -Dpath="/greeting" \ -Dextensions="spring-web"
-
如果您已有 Quarkus Maven 项目,则必须使用命令行为它添加
quarkus-spring-web扩展:
进入项目的根目录:
cd <project_name>将
quarkus-spring-web扩展添加到项目的pom.xml文件:./mvnw quarkus:add-extension -Dextensions="spring-web"使用这个命令,将以下条目添加到
pom.xml文件中:pom.xml
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-spring-web</artifactId> </dependency>
第 3 章 为 GreetingController 创建主类和测试类 复制链接链接已复制到粘贴板!
在命令行中创建项目时,Quarkus Maven 插件会自动使用 Spring Web 注解生成 GreetingController 类文件,该文件定义 REST 端点和包含 GreetingController 单元测试的类文件。
流程
创建包含以下代码的
src/main/java/org/acme/spring/web/GreetingController.java文件:src/main/java/org/acme/spring/web/GreetingController.java
package org.acme.spring.web; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/greeting") public class GreetingController { @GetMapping public String hello() { return "Hello Spring"; } }创建包含以下代码的
src/test/java/org/acme/spring/web/GreetingControllerTest.java文件:src/test/java/org/acme/spring/web/GreetingControllerTest.java
package org.acme.spring.web; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; @QuarkusTest public class GreetingControllerTest { @Test public void testHelloEndpoint() { given() .when().get("/greeting") .then() .statusCode(200) .body(is("Hello Spring")); } }
第 4 章 编译并启动 Spring Web 示例 复制链接链接已复制到粘贴板!
使用 Quarkus Maven 插件编译并启动示例应用程序。您还可以编译并运行 作为原生可执行文件 的应用程序。
流程
进入项目的根目录:
cd <project_name>使用 Quarkus Maven 插件在 development 模式下运行应用程序:
./mvnw compile quarkus:dev进入
http://localhost:8080/greetingYour browser 显示以下信息:Hello Spring
第 5 章 配置 GreetingController 以返回 JSON 响应 复制链接链接已复制到粘贴板!
设置 Spring Web 示例时会自动生成的 GreetingController 是一个简单端点,它以响应形式返回文本字符串。在更复杂的应用程序中,您可能需要配置 REST 控制器来以 JSON 格式返回响应。以下示例演示了如何配置 Spring RestController 来返回 JSON 内容:
流程
展开您的
GreetingController类,如示例所示。扩展的类返回一个 JSON 格式的响应,其中包含问候语和名称。请注意,您必须从 Spring Web 导入PathVariable注解类,以确保您的配置可以正常工作:src/main/java/org/acme/spring/web/GreetingController.java
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/greeting") public class GreetingController { @GetMapping public String hello() { return "hello"; } @GetMapping("/{name}") public Greeting hello(@PathVariable(name = "name") String name) { return new Greeting("hello " + name); } public static class Greeting { private final String message; public Greeting(String message) { this.message = message; } public String getMessage(){ return message; } } }
当更改 REST 端点时,还必须更新包含 REST 端点单元测试的类文件:
src/test/java/org/acme/spring/web/GreetingControllerTest.java
package org.acme.spring.web; import io.quarkus.test.junit.QuarkusTest; import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; import static org.hamcrest.CoreMatchers.is; @QuarkusTest public class GreetingControllerTest { @Test public void testHelloEndpoint() { given() .when().get("/greeting/quarkus") .then() .statusCode(200) .body("message", is("hello quarkus")); } }请注意,当您在 Quarkus 中使用 Spring Web 兼容性层时,com.fasterxml:jackson.core 依赖项会自动添加到应用程序的类路径中。
第 6 章 在 Spring Web 示例中启用 OpenAPI 和 Swagger-UI 支持 复制链接链接已复制到粘贴板!
您可以通过添加 quarkus-smallrye-openapi 扩展,为您的应用程序添加 Swagger-UI 生成 OpenAPI 模式文档的支持。
流程
输入以下命令添加
quarkus-smallrye-openapi扩展作为 Spring Web 示例的依赖项。添加扩展足以从 REST 端点生成基本的 OpenAPI 模式文档:./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-smallrye-openapi"输入命令将以下依赖项添加到您的
pom.xml中:pom.xml
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-smallrye-openapi</artifactId> </dependency>输入以下命令从
/q/openapi获取 schema 文档:curl http://localhost:8080/q/openapi您可以使用 YAML 格式生成的 OpenAPI 模式文档收到响应:
--- openapi: 3.0.3 info: title: Generated API version: "1.0" paths: /greeting: get: responses: "200": description: OK content: text/plain: schema: type: string /greeting/{name}: get: parameters: - name: name in: path required: true schema: type: string responses: "200": description: OK content: application/json: schema: $ref: '#/components/schemas/Greeting' components: schemas: Greeting: type: object properties: message: type: string
第 7 章 在您的 REST 控制器代码中添加 MicroProfile OpenAPI 注解 复制链接链接已复制到粘贴板!
您可以在其他控制器代码中添加 MicroProfile OpenAPI 注解,以便为其余端点生成更详细的 OpenAPI 模式。
流程
在
GreetingController的类级别添加@OpenApiDefinition注释。在注解中包含示例中显示的数据:@OpenAPIDefinition( info = @Info( title="Greeting API", version = "1.0.1", contact = @Contact( name = "Greeting API Support", url = "http://exampleurl.com/contact", email = "techsupport@example.com"), license = @License( name = "Apache 2.0", url = "https://www.apache.org/licenses/LICENSE-2.0.html")) )使用
@Tag注释标注端点定义。为每个端点提供名称和描述:@Tag(name = "Hello", description = "Just say hello") @GetMapping(produces=MediaType.TEXT_PLAIN_VALUE) public String hello() { return "hello"; } @GetMapping(value = "/{name}", produces=MediaType.APPLICATION_JSON_VALUE) @Tag(name = "Hello to someone", description = "Just say hello to someone") public Greeting hello(@PathVariable(name = "name") String name) { return new Greeting("hello " + name); }您在注解中提供的数据会出现在生成的 OpenAPI 模式中:
openapi: 3.0.3 info: title: Greeting API contact: name: Greeting API Support url: http://exampleurl.com/contact email: techsupport@example.com license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html version: 1.0.1 tags: - name: Hello description: Just say hello - name: Hello to someone description: Just say hello to someone paths: /greeting: get: tags: - Hello responses: '200': description: OK content: text/plain: schema: type: string /greeting/{name}: get: tags: - Hello to someone parameters: - name: name in: path required: true schema: type: string responses: '200': description: OK content: application/json: schema: $ref: '#/components/schemas/Greeting' components: schemas: Greeting: type: object properties: message: type: string
第 8 章 Quarkus 支持的 Spring Web 注解概述 复制链接链接已复制到粘贴板!
Quarkus 中的 Spring 兼容性层支持 Spring Web 提供的有限功能子集。具体来说,Quarkus 只支持 Spring Web 中的与 REST 相关的注解,例如 @RestController,但不支持 @Controller。
Quarkus 支持来自 Spring Web 的以下注解:
第 9 章 Spring Web 注释及其 JAX-RS 同等概述 复制链接链接已复制到粘贴板!
下表显示了如何将 Spring Web 注释转换为 JAX-RS 注释。
| Spring | JAX-RS | 备注 |
|---|---|---|
|
|
JAX-RS 中没有等效的。使用 | |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
|
| |
|
| 在 JAX-RS 中没有等效的。与请求正文对应的方法参数在 JAX-RS 中处理,无需任何注释。 | |
|
| 在 JAX-RS 中没有等效的。 | |
|
| 在 JAX-RS 中没有等效的。 | |
|
|
JAX-RS 中没有等效的注释。通过实施 |
第 10 章 Quarkus 支持的控制器方法参数类型 复制链接链接已复制到粘贴板!
除了可以使用上表中的适当 Spring Web 注解标注的方法参数外,还支持 javax.servlet.http.HttpServletRequest 和 javax.servlet.http.HttpServletResponse。但是,为了解决这个问题,用户需要添加 quarkus-undertow 依赖项。
第 11 章 Quarkus 中支持的控制器方法返回类型 复制链接链接已复制到粘贴板!
在 Quarkus 上使用 Spring Web 时支持以下方法返回类型:
- 原语类型
- 字符串(使用 作为字面值)Quarkus 不支持 Spring MVC 视图。
- 使用 JSON 序列化的 POJO 类
-
org.springframework.http.ResponseEntity
第 12 章 Quarkus 支持的异常处理器方法参数类型 复制链接链接已复制到粘贴板!
Spring Web API 的 Quarkus 扩展支持以下异常处理程序方法参数类型。(列出类型的顺序,不反映应使用单个参数类型的首选项顺序):
-
异常参数:声明为常规
例外或更具体的例外。如果注解本身没有使用value()指定异常类型,这也充当映射提示。 -
请求或响应对象(或两者)(通常来自 Servlet API)。您可以选择任何特定的请求或响应类型,如
ServletRequest或HttpServletRequest。您必须在项目中添加quarkus-undertow依赖项,以使用 Servlet API。
Quarkus 不支持 Spring ExceptionHandler Java API 文档 中提到的其他参数类型
第 13 章 Quarkus 中支持的异常处理器方法返回类型 复制链接链接已复制到粘贴板!
在 Quarkus 中使用 Spring Web 时支持以下方法返回类型:
-
org.springframework.http.ResponseEntity -
java.util.Map
Quarkus 不支持 Spring ExceptionHandler Java API 文档 中提到的其他返回类型。