【Quarkus】通过Quarkus集成后端服务示例
说明:
- REST资源接口(
AuthResource
)。 - REST资源实现类(
AuthResourceImpl
)。 - 服务接口(
AuthService
)。 - 服务实现类(
AuthServiceImpl
)。 - 配置文件(
application.properties
)。 - 测试类(
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. 代码实现
(1) AuthResource.java
(REST资源接口)
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
);
}
(2) AuthResourceImpl.java
(REST资源实现类)
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 {
@Inject
AuthService authService; // 注入AuthService接口
@Override
public boolean validateUser(String uid, String password) {
return authService.validateUser(uid, password); // 调用服务接口的方法
}
}
(3) AuthService.java
(服务接口)
package com.example;
public interface AuthService {
boolean validateUser(String uid, String password); // 定义验证方法
}
(4) AuthServiceImpl.java
(服务实现类)
package com.example;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped // 声明为CDI Bean
public class AuthServiceImpl implements AuthService {
@Override
public boolean validateUser(String uid, String password) {
// 简单的验证逻辑(示例)
return "admin".equals(uid) && "password123".equals(password);
}
}
(5) application.properties
(配置文件)
# 配置Quarkus应用的HTTP端口
quarkus.http.port=8080
(6) AuthResourceTest.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 {
@Test
public void testValidateUser_Success() {
given()
.formParam("uid", "admin")
.formParam("password", "password123")
.when()
.post("/auth/validate")
.then()
.statusCode(200)
.body(is("true")); // 验证返回值为true
}
@Test
public 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注入服务接口。
- 服务接口:定义业务逻辑的契约。
- 服务实现类:实现具体的业务逻辑。
通过这种方式,代码结构更加清晰,便于扩展和维护。你可以在此基础上进一步扩展功能,例如添加数据库支持、日志记录等。