【Quarkus】通过Quarkus集成后端服务示例

devtools/2025/3/16 13:15:50/

说明:

  1. REST资源接口AuthResource)。
  2. REST资源实现类AuthResourceImpl)。
  3. 服务接口AuthService)。
  4. 服务实现类AuthServiceImpl)。
  5. 配置文件application.properties)。
  6. 测试类AuthResourceTest)。

1. 项目结构

my-quarkus-app/
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── com/
│   │   │       └── example/
│   │   │           ├── AuthResource.java       # REST资源接口
│   │   │           ├── AuthResourceImpl.java   # REST资源实现类
│   │   │           ├── AuthService.java       # 服务接口
│   │   │           ├── AuthServiceImpl.java   # 服务实现类
│   │   ├── resources/
│   │   │   └── application.properties         # 配置文件
│   └── test/
│       ├── java/
│       │   └── com/
│       │       └── example/
│       │           └── AuthResourceTest.java  # 测试类
├── pom.xml                                    # Maven配置文件
└── README.md                                  # 项目说明文件

2. 代码实现

javaREST_39">(1) AuthResource.java(REST资源接口)
java">package com.example;import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;@Path("/auth")  // 定义接口的基础路径
public interface AuthResource {@POST@Path("/validate")  // 定义接口的具体路径@Consumes(MediaType.APPLICATION_FORM_URLENCODED)  // 接受表单数据@Produces(MediaType.APPLICATION_JSON)  // 返回JSON格式的数据boolean validateUser(@FormParam("uid") String uid,  // 从表单中获取uid@FormParam("password") String password  // 从表单中获取password);
}

javaREST_62">(2) AuthResourceImpl.java(REST资源实现类)
java">package com.example;import jakarta.inject.Inject;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.*;@ApplicationScoped  // 声明为CDI Bean
public class AuthResourceImpl implements AuthResource {@InjectAuthService authService;  // 注入AuthService接口@Overridepublic boolean validateUser(String uid, String password) {return authService.validateUser(uid, password);  // 调用服务接口的方法}
}

java_85">(3) AuthService.java(服务接口)
java">package com.example;public interface AuthService {boolean validateUser(String uid, String password);  // 定义验证方法
}

java_96">(4) AuthServiceImpl.java(服务实现类)
java">package com.example;import jakarta.enterprise.context.ApplicationScoped;@ApplicationScoped  // 声明为CDI Bean
public class AuthServiceImpl implements AuthService {@Overridepublic boolean validateUser(String uid, String password) {// 简单的验证逻辑(示例)return "admin".equals(uid) && "password123".equals(password);}
}

(5) application.properties(配置文件)
# 配置Quarkus应用的HTTP端口
quarkus.http.port=8080

java_123">(6) AuthResourceTest.java(测试类)
java">package com.example;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 AuthResourceTest {@Testpublic void testValidateUser_Success() {given().formParam("uid", "admin").formParam("password", "password123").when().post("/auth/validate").then().statusCode(200).body(is("true"));  // 验证返回值为true}@Testpublic void testValidateUser_Failure() {given().formParam("uid", "user").formParam("password", "wrongpassword").when().post("/auth/validate").then().statusCode(200).body(is("false"));  // 验证返回值为false}
}

3. 运行项目

(1) 启动开发模式

在项目根目录下运行以下命令启动Quarkus开发模式:

./mvnw quarkus:dev
(2) 访问接口

使用curl或Postman等工具测试接口。

  • 验证成功

    curl -X POST http://localhost:8080/auth/validate \-d "uid=admin" \-d "password=password123"
    

    返回结果:

    true
    
  • 验证失败

    curl -X POST http://localhost:8080/auth/validate \-d "uid=user" \-d "password=wrongpassword"
    

    返回结果:

    false
    

4. 运行测试

在项目根目录下运行以下命令执行测试:

./mvnw test

测试结果:

  • testValidateUser_Success:验证成功,返回true
  • testValidateUser_Failure:验证失败,返回false

5. 打包和运行

(1) 打包项目
./mvnw package
(2) 运行打包后的应用
java -jar target/quarkus-app/quarkus-run.jar

6. 总结

这个示例展示了如何在Quarkus中实现更清晰的分层架构:

  • REST资源接口:定义REST接口的契约。
  • REST资源实现类:实现REST接口的具体逻辑,并通过CDI注入服务接口。
  • 服务接口:定义业务逻辑的契约。
  • 服务实现类:实现具体的业务逻辑。

通过这种方式,代码结构更加清晰,便于扩展和维护。你可以在此基础上进一步扩展功能,例如添加数据库支持、日志记录等。


http://www.ppmy.cn/devtools/167567.html

相关文章

基于 GEE 利用 Sentinel-1 双极化数据计算 SDWI 指数实现逐月提取水域面积

目录 1 SDWI 指数 2 研究方法及数据处理 3 完整代码 4 运行结果 1 SDWI 指数 Sentinel-1双极化数据SDWI水体提取指数公式:SDWI ln ⁡(10VVVH) Sentinel-1 Dual-Polarized Water Index (SDWI)水体信息提取方法对 Sentinel-1 双极化数据(VV 和 VH)之间水体信息…

【图像处理】ISP(Image Signal Processor) 图像处理器的用途和工作原理?

ISP(图像信号处理器)是数字影像设备的“视觉大脑”,负责将传感器捕获的原始电信号转化为我们看到的高清图像。以下从用途和工作原理两方面通俗解析: 一、ISP的核心用途:让照片“更像眼睛看到的” 提升画质&#xff1a…

​技术解析麦萌短剧《阴阳无极》:从「性别偏见下的对抗训练」到「分布式江湖的架构重构」​

《阴阳无极》以陈千叶的武道觉醒为线索,展现了传统系统的路径依赖困境与对抗性策略的范式突破。本文将从算法博弈视角拆解这场武侠革命的底层逻辑,探讨如何在性别偏见的数据集中完成模型的自我进化。 ​1. 初始模型偏差:继承权剥夺与梯度冻结…

计算机网络开发--阻塞与非阻塞、同步与异步、http协议

阻塞与非阻塞 和 同步与异步 典型的一次IP的两个阶段:数据就绪和数据读写 数据就绪:根据系统IO操作的就绪状态 系统就绪分为阻塞和非阻塞。 如果是阻塞操作,那么当前线程会被挂起,等待资源准备好。在此期间,CPU会切换到其他线程…

mysql经典试题共34题

1、准备数据 -- drop drop table if exists dept; drop table if exists emp; drop table if exists salgrade;-- CREATE CREATE TABLE dept (deptno int NOT NULL COMMENT 部门编号,dname varchar(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMM…

外星人入侵-Python-三

武装飞船 开发一个名为《外星人入侵》的游戏吧!为此将使用 Pygame,这是一组功能强大而有趣的模块,可用于管理图形、动画乃至声音, 让你能够更轻松地开发复杂的游戏。通过使用Pygame来处理在屏幕上绘制图像 等任务,可将…

Vue3 响应式中 Reflect 的作用

在 Vue 3 的响应式系统中,Reflect 主要用于配合 Proxy 实现属性的拦截和默认行为执行,确保响应式系统能够正确追踪依赖和触发更新。以下是 Reflect 在 Vue 响应式中的核心作用: 1. 与 Proxy 配合完成默认行为 Proxy 用于拦截对象操作&#x…

L1-7 整数的持续性

题目 代码 #include <iostream> // 包含输入输出流的头文件 #include <vector> // 包含向量容器的头文件 #include <algorithm> // 包含算法函数的头文件 using namespace std; // 使用标准命名空间 // 定义一个名为 calculatePersistence 的函数…