mirror of
https://github.com/tursom/TursomServer.git
synced 2025-01-08 19:30:51 +08:00
添加 json 工具类
This commit is contained in:
parent
a7d6f4a211
commit
fbabf71a3b
6
json/build.gradle
Normal file
6
json/build.gradle
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
dependencies {
|
||||||
|
compileOnly 'com.alibaba:fastjson:1.2.62'
|
||||||
|
compileOnly group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
|
||||||
|
compileOnly group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.1'
|
||||||
|
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.1'
|
||||||
|
}
|
6
json/src/main/kotlin/cn/tursom/json/JsonWorker.kt
Normal file
6
json/src/main/kotlin/cn/tursom/json/JsonWorker.kt
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
package cn.tursom.json
|
||||||
|
|
||||||
|
interface JsonWorker {
|
||||||
|
fun toJson(obj: Any): String?
|
||||||
|
fun <T> fromJson(json: String, clazz: Class<T>): T?
|
||||||
|
}
|
23
json/src/main/kotlin/cn/tursom/json/JsonWorkerImpl.kt
Normal file
23
json/src/main/kotlin/cn/tursom/json/JsonWorkerImpl.kt
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package cn.tursom.json
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.databind.ObjectMapper
|
||||||
|
import com.google.gson.Gson
|
||||||
|
|
||||||
|
class JsonWorkerImpl : JsonWorker {
|
||||||
|
private val gson = try {
|
||||||
|
Gson()
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
private val jackson = try {
|
||||||
|
ObjectMapper()
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toJson(obj: Any): String? = gson?.toJson(obj) ?: jackson?.writeValueAsString(obj)
|
||||||
|
|
||||||
|
override fun <T> fromJson(json: String, clazz: Class<T>): T? =
|
||||||
|
gson?.fromJson(json, clazz) ?: jackson?.readValue(json, clazz)
|
||||||
|
}
|
@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory
|
|||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.jvm.jvmName
|
import kotlin.reflect.jvm.jvmName
|
||||||
|
|
||||||
class Slf4jImpl(name: String? = null) : Slf4j {
|
open class Slf4jImpl(name: String? = null) : Slf4j {
|
||||||
constructor(clazz: Class<*>?) : this(clazz?.name)
|
constructor(clazz: Class<*>?) : this(clazz?.name)
|
||||||
constructor(clazz: KClass<*>?) : this(clazz?.jvmName?.let {
|
constructor(clazz: KClass<*>?) : this(clazz?.jvmName?.let {
|
||||||
if (clazz.isCompanion) it.dropLast(10) else it
|
if (clazz.isCompanion) it.dropLast(10) else it
|
||||||
|
@ -6,7 +6,7 @@ import org.slf4j.LoggerFactory
|
|||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
import kotlin.reflect.jvm.jvmName
|
import kotlin.reflect.jvm.jvmName
|
||||||
|
|
||||||
class TrySlf4jImpl(name: String? = null) : TrySlf4j {
|
open class TrySlf4jImpl(name: String? = null) : TrySlf4j {
|
||||||
constructor(clazz: Class<*>?) : this(clazz?.name)
|
constructor(clazz: Class<*>?) : this(clazz?.name)
|
||||||
constructor(clazz: KClass<*>?) : this(clazz?.jvmName?.let {
|
constructor(clazz: KClass<*>?) : this(clazz?.jvmName?.let {
|
||||||
if (clazz.isCompanion) it.dropLast(10) else it
|
if (clazz.isCompanion) it.dropLast(10) else it
|
||||||
|
@ -3,4 +3,5 @@ include 'web', 'aop', 'database', 'database:database-async', 'utils', 'utils:xml
|
|||||||
include 'socket', 'socket:socket-async'
|
include 'socket', 'socket:socket-async'
|
||||||
include 'AsyncSocket'
|
include 'AsyncSocket'
|
||||||
include 'log'
|
include 'log'
|
||||||
|
include 'json'
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":")
|
implementation project(":")
|
||||||
|
compileOnly project(":json")
|
||||||
compileOnly group: 'org.slf4j', name: 'slf4j-api', version: '1.7.29'
|
compileOnly group: 'org.slf4j', name: 'slf4j-api', version: '1.7.29'
|
||||||
}
|
}
|
@ -1,11 +1,15 @@
|
|||||||
package cn.tursom.web.router
|
package cn.tursom.web.router
|
||||||
|
|
||||||
|
import cn.tursom.json.JsonWorkerImpl
|
||||||
import cn.tursom.web.ExceptionContent
|
import cn.tursom.web.ExceptionContent
|
||||||
import cn.tursom.web.HttpContent
|
import cn.tursom.web.HttpContent
|
||||||
import cn.tursom.web.HttpHandler
|
import cn.tursom.web.HttpHandler
|
||||||
import cn.tursom.web.router.impl.SimpleRouter
|
import cn.tursom.web.router.impl.SimpleRouter
|
||||||
import cn.tursom.web.router.mapping.*
|
import cn.tursom.web.router.mapping.*
|
||||||
|
import cn.tursom.web.utils.Chunked
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
|
import java.io.File
|
||||||
|
import java.io.RandomAccessFile
|
||||||
import java.lang.reflect.Method
|
import java.lang.reflect.Method
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -20,8 +24,8 @@ open class RoutedHttpHandler<T : HttpContent, in E : ExceptionContent>(
|
|||||||
target: Any? = null,
|
target: Any? = null,
|
||||||
val routerMaker: () -> Router<(T) -> Unit> = { SimpleRouter() }
|
val routerMaker: () -> Router<(T) -> Unit> = { SimpleRouter() }
|
||||||
) : HttpHandler<T, E> {
|
) : HttpHandler<T, E> {
|
||||||
private val router: Router<(T) -> Unit> = routerMaker()
|
protected val router: Router<(T) -> Unit> = routerMaker()
|
||||||
private val routerMap: HashMap<String, Router<(T) -> Unit>> = HashMap()
|
protected val routerMap: HashMap<String, Router<(T) -> Unit>> = HashMap()
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
@ -47,10 +51,13 @@ open class RoutedHttpHandler<T : HttpContent, in E : ExceptionContent>(
|
|||||||
val clazz = handler.javaClass
|
val clazz = handler.javaClass
|
||||||
clazz.methods.forEach { method ->
|
clazz.methods.forEach { method ->
|
||||||
method.parameterTypes.let {
|
method.parameterTypes.let {
|
||||||
if (it.size != 1 || !HttpContent::class.java.isAssignableFrom(it[0]))
|
if (it.size != 1 || !HttpContent::class.java.isAssignableFrom(it[0])) {
|
||||||
return@forEach
|
return@forEach
|
||||||
|
} else if (it.isNotEmpty()) {
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
}
|
}
|
||||||
insertMapping(method)
|
insertMapping(handler, method)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +76,7 @@ open class RoutedHttpHandler<T : HttpContent, in E : ExceptionContent>(
|
|||||||
getRouter(method).delRoute(safeRoute(route))
|
getRouter(method).delRoute(safeRoute(route))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun insertMapping(method: Method) {
|
protected fun insertMapping(obj: Any, method: Method) {
|
||||||
method.annotations.forEach { annotation ->
|
method.annotations.forEach { annotation ->
|
||||||
val routes: Array<out String>
|
val routes: Array<out String>
|
||||||
val router: Router<(T) -> Unit>
|
val router: Router<(T) -> Unit>
|
||||||
@ -117,13 +124,29 @@ open class RoutedHttpHandler<T : HttpContent, in E : ExceptionContent>(
|
|||||||
else -> return@forEach
|
else -> return@forEach
|
||||||
}
|
}
|
||||||
routes.forEach { route ->
|
routes.forEach { route ->
|
||||||
log?.info("method {} mapped to route {}", method, route)
|
log?.info("method route {} mapped to {}", route, method)
|
||||||
router[safeRoute(route)] = { content -> method(this, content) }
|
router[safeRoute(route)] = handler@{ content ->
|
||||||
|
if (method.parameterTypes.isEmpty()) {
|
||||||
|
val result = method(obj) ?: return@handler
|
||||||
|
when (result) {
|
||||||
|
is String -> content.finishHtml(result.toByteArray())
|
||||||
|
is ByteArray -> content.finishText(result)
|
||||||
|
is File -> content.finishFile(result)
|
||||||
|
is RandomAccessFile -> content.finishFile(result)
|
||||||
|
is Chunked -> content.finishChunked(result)
|
||||||
|
else -> json?.let {
|
||||||
|
content.finishJson(json.toJson(result)!!.toByteArray())
|
||||||
|
} ?: content.finishText(result.toString().toByteArray())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
method(obj, content)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getRouter(method: String): Router<(T) -> Unit> = when {
|
protected fun getRouter(method: String): Router<(T) -> Unit> = when {
|
||||||
method.isEmpty() -> router
|
method.isEmpty() -> router
|
||||||
else -> {
|
else -> {
|
||||||
val upperCaseMethod = method.toUpperCase()
|
val upperCaseMethod = method.toUpperCase()
|
||||||
@ -143,6 +166,12 @@ open class RoutedHttpHandler<T : HttpContent, in E : ExceptionContent>(
|
|||||||
null
|
null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val json = try {
|
||||||
|
JsonWorkerImpl()
|
||||||
|
} catch (e: Throwable) {
|
||||||
|
null
|
||||||
|
}
|
||||||
|
|
||||||
private fun safeRoute(route: String) = if (route.first() == '/') route else "/$route"
|
private fun safeRoute(route: String) = if (route.first() == '/') route else "/$route"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user