refactor(forgeboot-common):Refactoring the Unified Response Encapsulation Class R

- Removed unnecessary comments and redundant code
- Optimized how success and failure response objects are created - added a new extension field extra to save extension information
- Implemented the toMutableFlatMap and toFlatMap methods to convert the response object to Map
- Refactored the way ResultExtender is used to improve scalability
This commit is contained in:
gewuyou 2025-05-06 11:32:55 +08:00
parent 20118cd51c
commit 9cdc962d9a
2 changed files with 76 additions and 99 deletions

View File

@ -10,18 +10,7 @@ import com.gewuyou.forgeboot.common.result.impl.DefaultRequestIdProvider
/** /**
* 统一响应封装类 * 统一响应封装类
* *
* 该类用于统一系统中的响应格式提供基本地响应信息如状态码是否成功消息内容数据体等
* 并支持通过扩展器[ResultExtender]来扩展响应信息
*
* @param code 状态码
* @param success 是否成功
* @param message 响应消息
* @param data 响应数据体
* @param requestId 请求ID
* @param nameMap 响应字段名称映射表
*
* @since 2025-05-03 16:04:42 * @since 2025-05-03 16:04:42
* @author gewuyou
*/ */
data class R<T>( data class R<T>(
val code: Int, val code: Int,
@ -29,50 +18,47 @@ data class R<T>(
val message: String, val message: String,
val data: T? = null, val data: T? = null,
val requestId: String? = null, val requestId: String? = null,
val nameMap: Map<String, String> = mapOf( val extra: Map<String, Any?> = emptyMap() // ✅ 扩展字段保存位置
"code" to "code",
"success" to "success",
"message" to "message",
"data" to "data"
)
) { ) {
/** /**
* 将响应对象转换为Map对象 * 转换为可变 Map包含 extra 中的字段
*
* 此方法用于将响应对象转换为Map方便在不同层次中传递和处理响应信息
* 同时它允许通过[ResultExtender]来进一步扩展响应信息
*
* @param extenders 结果扩展器列表默认为空
* @return 转换后的Map对象
*/ */
fun toMap(extenders: List<ResultExtender> = emptyList()): MutableMap<String, Any?> { fun toMutableFlatMap(): MutableMap<String, Any?> {
val r = mutableMapOf( val map = mutableMapOf(
"code" to code, "code" to code,
"success" to success, "success" to success,
"message" to message, "message" to message,
"data" to data "data" to data
) )
if (!requestId.isNullOrBlank()) { if (!requestId.isNullOrBlank()) {
r["requestId"] = requestId map["requestId"] = requestId
} }
extenders.forEach { it.extend(r) } map.putAll(extra) // ✅ 扁平化合并
return r return map
} }
/**
* 转换为不可变 Map包含 extra 中的字段
*/
fun toFlatMap(): Map<String, Any?> = toMutableFlatMap().toMap()
companion object { companion object {
private fun buildExtraMap(extenders: List<ResultExtender>): Map<String, Any?> {
return mutableMapOf<String, Any?>().apply {
extenders.forEach { it.extend(this) }
}
}
/** /**
* 创建成功地响应对象 * 创建成功响应对象
*
* 该方法用于根据[ResponseInformation]创建一个成功地响应对象
* 它支持国际化消息解析和请求ID的生成并允许通过[ResultExtender]来扩展响应信息
* *
* @param info 响应信息对象 * @param info 响应信息对象
* @param data 响应数据体默认为null * @param data 响应数据
* @param messageResolver 消息解析器默认为[DefaultMessageResolver] * @param messageResolver 消息解析器
* @param requestIdProvider 请求ID提供者默认为[DefaultRequestIdProvider] * @param i18bArgs 国际化参数
* @param extenders 结果扩展器列表默认为空 * @param requestIdProvider 请求ID提供者
* @return 创建的响应对象 * @param extenders 扩展信息提供者列表
* @return 成功响应对象
*/ */
fun <T> success( fun <T> success(
info: ResponseInformation, info: ResponseInformation,
@ -82,28 +68,22 @@ data class R<T>(
requestIdProvider: RequestIdProvider? = null, requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList() extenders: List<ResultExtender> = emptyList()
): R<T> { ): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve( val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs)
info.responseI8nMessageCode,
i18bArgs
)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
return R(info.responseCode, true, msg, data, reqId).also { val extra = buildExtraMap(extenders)
extenders.forEach { extender -> extender.extend(it.toMap()) } return R(info.responseCode, true, msg, data, reqId, extra)
}
} }
/** /**
* 创建失败的响应对象 * 创建失败响应对象
*
* 该方法用于根据[ResponseInformation]创建一个失败的响应对象
* 它支持国际化消息解析和请求ID的生成并允许通过[ResultExtender]来扩展响应信息
* *
* @param info 响应信息对象 * @param info 响应信息对象
* @param data 响应数据体默认为null * @param data 响应数据
* @param messageResolver 消息解析器默认为[DefaultMessageResolver] * @param messageResolver 消息解析器
* @param requestIdProvider 请求ID提供者默认为[DefaultRequestIdProvider] * @param i18bArgs 国际化参数
* @param extenders 结果扩展器列表默认为空 * @param requestIdProvider 请求ID提供者
* @return 创建的响应对象 * @param extenders 扩展信息提供者列表
* @return 失败响应对象
*/ */
fun <T> failure( fun <T> failure(
info: ResponseInformation, info: ResponseInformation,
@ -113,77 +93,64 @@ data class R<T>(
requestIdProvider: RequestIdProvider? = null, requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList() extenders: List<ResultExtender> = emptyList()
): R<T> { ): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve( val msg = (messageResolver ?: DefaultMessageResolver).resolve(info.responseI8nMessageCode, i18bArgs)
info.responseI8nMessageCode,
i18bArgs
)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
return R(info.responseCode, false, msg, data, reqId).also { val extra = buildExtraMap(extenders)
extenders.forEach { extender -> extender.extend(it.toMap()) } return R(info.responseCode, false, msg, data, reqId, extra)
}
} }
/** /**
* 创建成功响应对象 * 创建成功响应对象
* *
* 该方法用于创建一个简单的成功响应对象支持自定义状态码消息代码消息参数和数据体 * @param code 响应码
* 它支持国际化消息解析和请求ID的生成并允许通过[ResultExtender]来扩展响应信息 * @param messageCode 消息码
* * @param data 响应数据
* @param code 状态码默认为200 * @param i18nArgs 国际化参数
* @param messageCode 消息代码默认为"success" * @param messageResolver 消息解析器
* @param args 消息参数默认为null * @param requestIdProvider 请求ID提供者
* @param data 响应数据体默认为null * @param extenders 扩展信息提供者列表
* @param messageResolver 消息解析器默认为[DefaultMessageResolver] * @return 成功响应对象
* @param requestIdProvider 请求ID提供者默认为[DefaultRequestIdProvider]
* @param extenders 结果扩展器列表默认为空
* @return 创建的响应对象
*/ */
fun <T> success( fun <T> success(
code: Int = 200, code: Int = 200,
messageCode: String = "success", messageCode: String = "success",
data: T? = null, data: T? = null,
i18bArgs: Array<Any>? = null, i18nArgs: Array<Any>? = null,
messageResolver: MessageResolver? = null, messageResolver: MessageResolver? = null,
requestIdProvider: RequestIdProvider? = null, requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList() extenders: List<ResultExtender> = emptyList()
): R<T> { ): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18bArgs) val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18nArgs)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
return R(code, true, msg, data, reqId).also { val extra = buildExtraMap(extenders)
extenders.forEach { extender -> extender.extend(it.toMap()) } return R(code, true, msg, data, reqId, extra)
}
} }
/** /**
* 创建失败响应对象 * 创建失败响应对象
* *
* 该方法用于创建一个简单的失败响应对象支持自定义状态码消息代码消息参数和数据体 * @param code 响应码
* 它支持国际化消息解析和请求ID的生成并允许通过[ResultExtender]来扩展响应信息 * @param messageCode 消息码
* * @param data 响应数据
* @param code 状态码默认为400 * @param i18nArgs 国际化参数
* @param messageCode 消息代码默认为"error" * @param messageResolver 消息解析器
* @param args 消息参数默认为null * @param requestIdProvider 请求ID提供者
* @param data 响应数据体默认为null * @param extenders 扩展信息提供者列表
* @param messageResolver 消息解析器默认为[DefaultMessageResolver] * @return 失败响应对象
* @param requestIdProvider 请求ID提供者默认为[DefaultRequestIdProvider]
* @param extenders 结果扩展器列表默认为空
* @return 创建的响应对象
*/ */
fun <T> failure( fun <T> failure(
code: Int = 400, code: Int = 400,
messageCode: String = "error", messageCode: String = "error",
data: T? = null, data: T? = null,
i18bArgs: Array<Any>? = null, i18nArgs: Array<Any>? = null,
messageResolver: MessageResolver? = null, messageResolver: MessageResolver? = null,
requestIdProvider: RequestIdProvider? = null, requestIdProvider: RequestIdProvider? = null,
extenders: List<ResultExtender> = emptyList() extenders: List<ResultExtender> = emptyList()
): R<T> { ): R<T> {
val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18bArgs) val msg = (messageResolver ?: DefaultMessageResolver).resolve(messageCode, i18nArgs)
val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId() val reqId = (requestIdProvider ?: DefaultRequestIdProvider).getRequestId()
return R(code, false, msg, data, reqId).also { val extra = buildExtraMap(extenders)
extenders.forEach { extender -> extender.extend(it.toMap()) } return R(code, false, msg, data, reqId, extra)
}
} }
} }
} }

View File

@ -10,7 +10,7 @@ kotlinxSerializationJSON-version = "1.7.3"
axion-release-version = "1.18.7" axion-release-version = "1.18.7"
spring-cloud-version = "2024.0.1" spring-cloud-version = "2024.0.1"
spring-boot-version = "3.4.4" spring-boot-version = "3.4.4"
latest-release="latest.release"
slf4j-version = "2.0.17" slf4j-version = "2.0.17"
[libraries] [libraries]
kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin-version" } kotlinGradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin-version" }
@ -32,11 +32,21 @@ springBoot-configuration-processor = { group = "org.springframework.boot", name
springCloudDependencies-bom = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "spring-cloud-version" } springCloudDependencies-bom = { module = "org.springframework.cloud:spring-cloud-dependencies", version.ref = "spring-cloud-version" }
springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" } springCloudStarter-openfeign = { group = "org.springframework.cloud", name = "spring-cloud-starter-openfeign" }
# Jackson
jackson-core={group="com.fasterxml.jackson.core", name="jackson-core"}
jackson-databind={group="com.fasterxml.jackson.core", name="jackson-databind"}
jackson-annotations={group="com.fasterxml.jackson.core", name="jackson-annotations"}
jackson-datatype-jsr310={group="com.fasterxml.jackson.datatype", name="jackson-datatype-jsr310"}
jackson-module-kotlin={group="com.fasterxml.jackson.module", name="jackson-module-kotlin"}
reactor-core={group="io.projectreactor", name="reactor-core"} reactor-core={group="io.projectreactor", name="reactor-core"}
# Libraries can be bundled together for easier import # Libraries can be bundled together for easier import
[bundles] [bundles]
kotlinxEcosystem = ["kotlinxDatetime", "kotlinxSerialization", "kotlinxCoroutines-core"] kotlinxEcosystem = ["kotlinxDatetime", "kotlinxSerialization", "kotlinxCoroutines-core"]
jacksonAll = [
"jackson-core", "jackson-databind", "jackson-annotations","jackson-datatype-jsr310", "jackson-module-kotlin"
]
[plugins] [plugins]
# 应用 Java 插件,提供基本的 Java 代码编译和构建能力 # 应用 Java 插件,提供基本的 Java 代码编译和构建能力
java = { id = "java" } java = { id = "java" }