plx 3 rokov pred
rodič
commit
c22461069d

+ 5 - 3
gradle.properties

@@ -25,8 +25,8 @@
 #
 
 PERSAGY_URL = http://www.persagy.com
-PERSAGY_KOTLIN_VERSION = 1.5.3
-PERSAGY_SERVICE_VERSION = 1.5.1
+PERSAGY_KOTLIN_VERSION = 1.5.4
+PERSAGY_SERVICE_VERSION = 1.5.2
 #PERSAGY_SERVICE_VERSION = 1.4.164
 
 MAVEN_REPO_PUBLIC_URL = http://dev.dp.sagacloud.cn:8082/repository/maven-public/
@@ -48,8 +48,10 @@ JDK_VERSION = 8
 COMMONS_LANG_VERSION = 3.9
 # https://mvnrepository.com/artifact/org.jetbrains.dokka/dokka-gradle-plugin
 DOKKA_VERSION = 0.9.16
+# https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
+JACKSON_VERSION = 2.12.2
 # https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-stdlib-jdk8
-KOTLIN_VERSION = 1.3.61
+KOTLIN_VERSION = 1.4.32
 # https://mvnrepository.com/artifact/org.apache.shiro/shiro-spring-boot-web-starter
 SHIRO_VERSION = 1.4.2
 # https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web

+ 92 - 92
persagy-service-base/src/main/kotlin/com/persagy/service/json/SFastjsonAnnotationIntrospector.kt

@@ -1,92 +1,92 @@
-/*
- * *********************************************************************************************************************
- *
- *          !!
- *        .F88X
- *        X8888Y
- *      .}888888N;
- *        i888888N;        .:!              .I$WI:
- *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
- *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
- *            +888888N;  .8888888Y                                  "&&8Y.}8,
- *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
- *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
- *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
- *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
- *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
- *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
- *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
- *      .:R888888I
- *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
- *        ~8888'
- *        .!88~                                                                     All rights reserved.
- *
- * *********************************************************************************************************************
- */
-
-package com.persagy.service.json
-
-import com.alibaba.fastjson.annotation.JSONField
-import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector
-import com.fasterxml.jackson.databind.PropertyName
-import com.fasterxml.jackson.databind.introspect.Annotated
-import com.persagy.base.extensions.toJson
-
-/**
- * swagger 使用的 json 注解拦截器
- *
- * @author 庞利祥 <sybotan@126.com>
- */
-class SFastjsonAnnotationIntrospector : JacksonAnnotationIntrospector() {
-
-    /**
-     * 判断注解是否为 JSONField 类型
-     *
-     * @param ann         注解
-     * @return 如果有 JSONField 注解,则返回 true;否则 false.
-     */
-    override fun isAnnotationBundle(ann: Annotation): Boolean {
-        println("ann = ${ann.toJson()}")
-        return if (ann.annotationClass == JSONField::class.java) {
-            println("ann = ======")
-            true
-        } else {
-            println("ann = -------")
-            super.isAnnotationBundle(ann)
-        }
-    }
-
-    /**
-     * 为序列为操作查找属性名
-     *
-     * @param a           注解
-     * @return 属性名
-     */
-    override fun findNameForSerialization(a: Annotated): PropertyName? {
-        val nameForSerialization = super.findNameForSerialization(a)
-        if (nameForSerialization == null || nameForSerialization === PropertyName.USE_DEFAULT) {
-            val jsonField = _findAnnotation(a, JSONField::class.java)
-            if (jsonField != null) {
-                return PropertyName.construct(jsonField.name)
-            }
-        }
-        return nameForSerialization
-    }
-
-    /**
-     * 为反序列为操作查找属性名
-     *
-     * @param a           注解
-     * @return 属性名
-     */
-    override fun findNameForDeserialization(a: Annotated): PropertyName? {
-        val nameForDeserialization = super.findNameForDeserialization(a)
-        if (nameForDeserialization == null || nameForDeserialization === PropertyName.USE_DEFAULT) {
-            val jsonField = _findAnnotation(a, JSONField::class.java)
-            if (jsonField != null) {
-                return PropertyName.construct(jsonField.name)
-            }
-        }
-        return nameForDeserialization
-    }
-}
+///*
+// * *********************************************************************************************************************
+// *
+// *          !!
+// *        .F88X
+// *        X8888Y
+// *      .}888888N;
+// *        i888888N;        .:!              .I$WI:
+// *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
+// *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
+// *            +888888N;  .8888888Y                                  "&&8Y.}8,
+// *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
+// *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
+// *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
+// *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
+// *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
+// *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
+// *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
+// *      .:R888888I
+// *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
+// *        ~8888'
+// *        .!88~                                                                     All rights reserved.
+// *
+// * *********************************************************************************************************************
+// */
+//
+//package com.persagy.service.json
+//
+//import com.alibaba.fastjson.annotation.JSONField
+//import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector
+//import com.fasterxml.jackson.databind.PropertyName
+//import com.fasterxml.jackson.databind.introspect.Annotated
+//import com.persagy.base.extensions.toJson
+//
+///**
+// * swagger 使用的 json 注解拦截器
+// *
+// * @author 庞利祥 <sybotan@126.com>
+// */
+//class SFastjsonAnnotationIntrospector : JacksonAnnotationIntrospector() {
+//
+//    /**
+//     * 判断注解是否为 JSONField 类型
+//     *
+//     * @param ann         注解
+//     * @return 如果有 JSONField 注解,则返回 true;否则 false.
+//     */
+//    override fun isAnnotationBundle(ann: Annotation): Boolean {
+//        println("ann = ${ann.toJson()}")
+//        return if (ann.annotationClass == JSONField::class.java) {
+//            println("ann = ======")
+//            true
+//        } else {
+//            println("ann = -------")
+//            super.isAnnotationBundle(ann)
+//        }
+//    }
+//
+//    /**
+//     * 为序列为操作查找属性名
+//     *
+//     * @param a           注解
+//     * @return 属性名
+//     */
+//    override fun findNameForSerialization(a: Annotated): PropertyName? {
+//        val nameForSerialization = super.findNameForSerialization(a)
+//        if (nameForSerialization == null || nameForSerialization === PropertyName.USE_DEFAULT) {
+//            val jsonField = _findAnnotation(a, JSONField::class.java)
+//            if (jsonField != null) {
+//                return PropertyName.construct(jsonField.name)
+//            }
+//        }
+//        return nameForSerialization
+//    }
+//
+//    /**
+//     * 为反序列为操作查找属性名
+//     *
+//     * @param a           注解
+//     * @return 属性名
+//     */
+//    override fun findNameForDeserialization(a: Annotated): PropertyName? {
+//        val nameForDeserialization = super.findNameForDeserialization(a)
+//        if (nameForDeserialization == null || nameForDeserialization === PropertyName.USE_DEFAULT) {
+//            val jsonField = _findAnnotation(a, JSONField::class.java)
+//            if (jsonField != null) {
+//                return PropertyName.construct(jsonField.name)
+//            }
+//        }
+//        return nameForDeserialization
+//    }
+//}

+ 74 - 74
persagy-service-base/src/main/kotlin/com/persagy/service/json/SJsonHttpMessageConverter.kt

@@ -1,74 +1,74 @@
-/*
- * *********************************************************************************************************************
- *
- *          !!
- *        .F88X
- *        X8888Y
- *      .}888888N;
- *        i888888N;        .:!              .I$WI:
- *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
- *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
- *            +888888N;  .8888888Y                                  "&&8Y.}8,
- *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
- *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
- *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
- *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
- *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
- *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
- *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
- *      .:R888888I
- *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
- *        ~8888'
- *        .!88~                                                                     All rights reserved.
- *
- * *********************************************************************************************************************
- */
-
-package com.persagy.service.json
-
-import com.alibaba.fastjson.JSON
-import com.alibaba.fastjson.PropertyNamingStrategy
-import com.alibaba.fastjson.serializer.NameFilter
-import com.alibaba.fastjson.serializer.SerializerFeature
-import com.alibaba.fastjson.support.config.FastJsonConfig
-import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
-import com.persagy.base.utils.SJsonUtil
-import org.springframework.http.MediaType
-
-/**
- *
- */
-open class SJsonHttpMessageConverter : FastJsonHttpMessageConverter() {
-
-    /**
-     * 属性名命名规则
-     */
-    var propertyNamingStrategy : PropertyNamingStrategy
-        get() = SJsonUtil.serializeConfig.propertyNamingStrategy
-        set(value) {
-            SJsonUtil.serializeConfig.propertyNamingStrategy = value
-        } // Set propertyNamingStrategy
-
-    init {
-        val fastJsonConfig = FastJsonConfig()
-        fastJsonConfig.dateFormat = JSON.DEFFAULT_DATE_FORMAT
-        fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect)
-        this.fastJsonConfig = fastJsonConfig;
-
-        val nameFilter = NameFilter({ obj, name, value -> name })
-//        SJsonUtil.serializeConfig.addFilter(UiConfiguration::class.java, nameFilter)
-//        SJsonUtil.serializeConfig.addFilter(SwaggerResource::class.java, nameFilter)
-//        serializeConfig.addFilter(MetricsEndpoint.MetricResponse::class.java, nameFilter)
-//        serializeConfig.addFilter(EnvironmentEndpoint.EnvironmentDescriptor::class.java, nameFilter)
-        fastJsonConfig.serializeConfig = SJsonUtil.serializeConfig
-
-        val fastMediaTypes = ArrayList<MediaType>()
-        fastMediaTypes.add(MediaType.APPLICATION_JSON)
-        fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED)
-        fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM)
-        fastMediaTypes.add(MediaType.TEXT_HTML)
-        fastMediaTypes.add(MediaType("application", "vnd.spring-boot.actuator.v2+json"))
-        this.supportedMediaTypes = fastMediaTypes;
-    } // Init
-
-} // Class SJsonHttpMessageConverter`
+///*
+// * *********************************************************************************************************************
+// *
+// *          !!
+// *        .F88X
+// *        X8888Y
+// *      .}888888N;
+// *        i888888N;        .:!              .I$WI:
+// *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
+// *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
+// *            +888888N;  .8888888Y                                  "&&8Y.}8,
+// *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
+// *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
+// *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
+// *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
+// *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
+// *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
+// *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
+// *      .:R888888I
+// *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
+// *        ~8888'
+// *        .!88~                                                                     All rights reserved.
+// *
+// * *********************************************************************************************************************
+// */
+//
+//package com.persagy.service.json
+//
+//import com.alibaba.fastjson.JSON
+//import com.alibaba.fastjson.PropertyNamingStrategy
+//import com.alibaba.fastjson.serializer.NameFilter
+//import com.alibaba.fastjson.serializer.SerializerFeature
+//import com.alibaba.fastjson.support.config.FastJsonConfig
+//import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter
+//import com.persagy.base.utils.SJsonUtil
+//import org.springframework.http.MediaType
+//
+///**
+// *
+// */
+//open class SJsonHttpMessageConverter : FastJsonHttpMessageConverter() {
+//
+//    /**
+//     * 属性名命名规则
+//     */
+//    var propertyNamingStrategy : PropertyNamingStrategy
+//        get() = SJsonUtil.serializeConfig.propertyNamingStrategy
+//        set(value) {
+//            SJsonUtil.serializeConfig.propertyNamingStrategy = value
+//        } // Set propertyNamingStrategy
+//
+//    init {
+//        val fastJsonConfig = FastJsonConfig()
+//        fastJsonConfig.dateFormat = JSON.DEFFAULT_DATE_FORMAT
+//        fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect)
+//        this.fastJsonConfig = fastJsonConfig;
+//
+//        val nameFilter = NameFilter({ obj, name, value -> name })
+////        SJsonUtil.serializeConfig.addFilter(UiConfiguration::class.java, nameFilter)
+////        SJsonUtil.serializeConfig.addFilter(SwaggerResource::class.java, nameFilter)
+////        serializeConfig.addFilter(MetricsEndpoint.MetricResponse::class.java, nameFilter)
+////        serializeConfig.addFilter(EnvironmentEndpoint.EnvironmentDescriptor::class.java, nameFilter)
+//        fastJsonConfig.serializeConfig = SJsonUtil.serializeConfig
+//
+//        val fastMediaTypes = ArrayList<MediaType>()
+//        fastMediaTypes.add(MediaType.APPLICATION_JSON)
+//        fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED)
+//        fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM)
+//        fastMediaTypes.add(MediaType.TEXT_HTML)
+//        fastMediaTypes.add(MediaType("application", "vnd.spring-boot.actuator.v2+json"))
+//        this.supportedMediaTypes = fastMediaTypes;
+//    } // Init
+//
+//} // Class SJsonHttpMessageConverter`

+ 157 - 157
persagy-service-base/src/main/kotlin/com/persagy/service/utils/SJsonUtil.kt

@@ -1,157 +1,157 @@
-/*
- * *********************************************************************************************************************
- *
- *          !!
- *        .F88X
- *        X8888Y
- *      .}888888N;
- *        i888888N;        .:!              .I$WI:
- *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
- *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
- *            +888888N;  .8888888Y                                  "&&8Y.}8,
- *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
- *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
- *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
- *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
- *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
- *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
- *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
- *      .:R888888I
- *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
- *        ~8888'
- *        .!88~                                                                     All rights reserved.
- *
- * *********************************************************************************************************************
- */
-
-package com.persagy.service.utils
-
-import com.alibaba.fastjson.JSON
-import com.alibaba.fastjson.PropertyNamingStrategy
-import com.alibaba.fastjson.serializer.SerializeConfig
-import com.alibaba.fastjson.serializer.SerializerFeature
-import java.io.InputStream
-import java.lang.reflect.Type
-
-object SJsonUtil {
-    /** 序列化配置 */
-    val serializeConfig = SerializeConfig()
-
-    /**
-     * 转换对象到 json 格式字符串
-     *
-     * @param obj                     被转换对象
-     * @param namingStrategy          命名规则
-     * @return json 格式字符串
-     */
-    fun toJson(obj: Any, namingStrategy: PropertyNamingStrategy? = null): String {
-        return if (null == namingStrategy) {
-            JSON.toJSONString(obj, serializeConfig, SerializerFeature.DisableCircularReferenceDetect)
-        } else {
-            val config = SerializeConfig()
-            config.propertyNamingStrategy = namingStrategy
-            JSON.toJSONString(obj, config, SerializerFeature.DisableCircularReferenceDetect)
-        }
-    }
-
-    /**
-     * 转换对象到 json 格式字符串,包含空字符串
-     *
-     * @param obj                     被转换对象
-     * @param namingStrategy          首字母是否大写
-     * @return json 格式字符串
-     */
-    fun toJsonAll(obj: Any, namingStrategy: PropertyNamingStrategy? = null): String {
-        return if (null == namingStrategy) {
-            JSON.toJSONString(obj,
-                    serializeConfig,
-                    SerializerFeature.WriteMapNullValue,
-                    SerializerFeature.WriteNullListAsEmpty,
-                    SerializerFeature.DisableCircularReferenceDetect)
-        } else {
-            val config = SerializeConfig()
-            config.propertyNamingStrategy = namingStrategy
-            JSON.toJSONString(obj,
-                    config,
-                    SerializerFeature.WriteMapNullValue,
-                    SerializerFeature.WriteNullListAsEmpty,
-                    SerializerFeature.DisableCircularReferenceDetect)
-        }
-    }
-
-    /**
-     * 将 Json 数据解析成相应的映射对象
-     *
-     * @param jsonData                要解析的 JSON 数据
-     * @param type                    Java 类型
-     * @return 解析结果
-     */
-    @Throws(Exception::class)
-    fun <T> fromJson(jsonData: String, type: Class<T>): T? {
-        return JSON.parseObject(jsonData, type)
-    }
-
-    /**
-     * 将 Json 数据解析成相应的映射对象
-     *
-     * @param jsonData                要解析的 JSON 数据
-     * @param type                    Java 类型
-     * @return 解析结果
-     */
-    @Throws(Exception::class)
-    fun fromJson(jsonData: String, type: Type): Any? {
-        return JSON.parseObject(jsonData, type)
-    }
-
-    /**
-     * 将 Json 数据解析成相应的映射对象
-     *
-     * @param input                   要解析的 JSON 数据输入流
-     * @param type                    Java 类型
-     * @param namingStrategy          命名规则
-     * @return 解析结果
-     */
-    @Throws(Exception::class)
-    fun <T> fromJson(input: InputStream, type: Class<T>): T? {
-        val count = input.available()
-        val buf = ByteArray(count)
-        var readCount = 0
-        while (readCount < count) {
-            readCount += input.read(buf, readCount, count - readCount)
-        }
-
-        return fromJson(String(buf), type)
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    /**
-     * 将 Json 数据解析成相应的映射对象
-     *
-     * @param jsonData                要解析的 JSON 数据
-     * @param namingStrategy          命名规则
-     * @return 解析结果
-     */
-    @Throws(Exception::class)
-    inline fun <reified T> fromJson(jsonData: String, namingStrategy: PropertyNamingStrategy? = null): T {
-        return JSON.parseObject(jsonData, T::class.java)
-    }
-
-    /**
-     * 将 Json 数据解析成相应的映射对象
-     *
-     * @param input                   要解析的 JSON 数据输入流
-     * @param namingStrategy          命名规则
-     * @return 解析结果
-     */
-    @Throws(Exception::class)
-    inline fun <reified T> fromJson(input: InputStream, namingStrategy: PropertyNamingStrategy? = null): T {
-        val count = input.available()
-        val buf = ByteArray(count)
-        var readCount = 0
-        while (readCount < count) {
-            readCount += input.read(buf, readCount, count - readCount)
-        }
-
-        return fromJson(String(buf), namingStrategy)
-    }
-}
+///*
+// * *********************************************************************************************************************
+// *
+// *          !!
+// *        .F88X
+// *        X8888Y
+// *      .}888888N;
+// *        i888888N;        .:!              .I$WI:
+// *          R888888I      .'N88~            i8}+8Y&8"l8i$8>8W~'>W8}8]KW+8IIN"8&
+// *          .R888888I    .;N8888~          .X8'  "8I.!,/8"  !%NY8`"8I8~~8>,88I
+// *            +888888N;  .8888888Y                                  "&&8Y.}8,
+// *            ./888888N;  .R888888Y        .'}~    .>}'.`+>  i}!    "i'  +/'  .'i~  !11,.:">,  .~]!  .i}i
+// *              ~888888%:  .I888888l      .]88~`1/iY88Ii+1'.R$8$8]"888888888>  Y8$  W8E  X8E  W8888'188Il}Y88$*
+// *              18888888    E8888881    .]W%8$`R8X'&8%++N8i,8N%N8+l8%`  .}8N:.R$RE%N88N%N$K$R  188,FE$8%~Y88I
+// *            .E888888I  .i8888888'      .:$8I;88+`E8R:/8N,.>881.`$8E/1/]N8X.Y8N`"KF&&FK!'88*."88K./$88%RN888+~
+// *            8888888I  .,N888888~        ~88i"8W,!N8*.I88.}888%F,i$88"F88"  888:E8X.>88!i88>`888*.}Fl1]*}1YKi'
+// *          i888888N'      I888Y          ]88;/EX*IFKFK88X  K8R  .l8W  88Y  ~88}'88E&%8W.X8N``]88!.$8K  .:W8I
+// *        .i888888N;        I8Y          .&8$  .X88!  i881.:%888>I88  ;88]  +88+.';;;;:.Y88X  18N.,88l  .+88/
+// *      .:R888888I
+// *      .&888888I                                          Copyright (c) 2016-2020.  博锐尚格科技股份有限公司
+// *        ~8888'
+// *        .!88~                                                                     All rights reserved.
+// *
+// * *********************************************************************************************************************
+// */
+//
+//package com.persagy.service.utils
+//
+//import com.alibaba.fastjson.JSON
+//import com.alibaba.fastjson.PropertyNamingStrategy
+//import com.alibaba.fastjson.serializer.SerializeConfig
+//import com.alibaba.fastjson.serializer.SerializerFeature
+//import java.io.InputStream
+//import java.lang.reflect.Type
+//
+//object SJsonUtil {
+//    /** 序列化配置 */
+//    val serializeConfig = SerializeConfig()
+//
+//    /**
+//     * 转换对象到 json 格式字符串
+//     *
+//     * @param obj                     被转换对象
+//     * @param namingStrategy          命名规则
+//     * @return json 格式字符串
+//     */
+//    fun toJson(obj: Any, namingStrategy: PropertyNamingStrategy? = null): String {
+//        return if (null == namingStrategy) {
+//            JSON.toJSONString(obj, serializeConfig, SerializerFeature.DisableCircularReferenceDetect)
+//        } else {
+//            val config = SerializeConfig()
+//            config.propertyNamingStrategy = namingStrategy
+//            JSON.toJSONString(obj, config, SerializerFeature.DisableCircularReferenceDetect)
+//        }
+//    }
+//
+//    /**
+//     * 转换对象到 json 格式字符串,包含空字符串
+//     *
+//     * @param obj                     被转换对象
+//     * @param namingStrategy          首字母是否大写
+//     * @return json 格式字符串
+//     */
+//    fun toJsonAll(obj: Any, namingStrategy: PropertyNamingStrategy? = null): String {
+//        return if (null == namingStrategy) {
+//            JSON.toJSONString(obj,
+//                    serializeConfig,
+//                    SerializerFeature.WriteMapNullValue,
+//                    SerializerFeature.WriteNullListAsEmpty,
+//                    SerializerFeature.DisableCircularReferenceDetect)
+//        } else {
+//            val config = SerializeConfig()
+//            config.propertyNamingStrategy = namingStrategy
+//            JSON.toJSONString(obj,
+//                    config,
+//                    SerializerFeature.WriteMapNullValue,
+//                    SerializerFeature.WriteNullListAsEmpty,
+//                    SerializerFeature.DisableCircularReferenceDetect)
+//        }
+//    }
+//
+//    /**
+//     * 将 Json 数据解析成相应的映射对象
+//     *
+//     * @param jsonData                要解析的 JSON 数据
+//     * @param type                    Java 类型
+//     * @return 解析结果
+//     */
+//    @Throws(Exception::class)
+//    fun <T> fromJson(jsonData: String, type: Class<T>): T? {
+//        return JSON.parseObject(jsonData, type)
+//    }
+//
+//    /**
+//     * 将 Json 数据解析成相应的映射对象
+//     *
+//     * @param jsonData                要解析的 JSON 数据
+//     * @param type                    Java 类型
+//     * @return 解析结果
+//     */
+//    @Throws(Exception::class)
+//    fun fromJson(jsonData: String, type: Type): Any? {
+//        return JSON.parseObject(jsonData, type)
+//    }
+//
+//    /**
+//     * 将 Json 数据解析成相应的映射对象
+//     *
+//     * @param input                   要解析的 JSON 数据输入流
+//     * @param type                    Java 类型
+//     * @param namingStrategy          命名规则
+//     * @return 解析结果
+//     */
+//    @Throws(Exception::class)
+//    fun <T> fromJson(input: InputStream, type: Class<T>): T? {
+//        val count = input.available()
+//        val buf = ByteArray(count)
+//        var readCount = 0
+//        while (readCount < count) {
+//            readCount += input.read(buf, readCount, count - readCount)
+//        }
+//
+//        return fromJson(String(buf), type)
+//    }
+//
+//    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//    /**
+//     * 将 Json 数据解析成相应的映射对象
+//     *
+//     * @param jsonData                要解析的 JSON 数据
+//     * @param namingStrategy          命名规则
+//     * @return 解析结果
+//     */
+//    @Throws(Exception::class)
+//    inline fun <reified T> fromJson(jsonData: String, namingStrategy: PropertyNamingStrategy? = null): T {
+//        return JSON.parseObject(jsonData, T::class.java)
+//    }
+//
+//    /**
+//     * 将 Json 数据解析成相应的映射对象
+//     *
+//     * @param input                   要解析的 JSON 数据输入流
+//     * @param namingStrategy          命名规则
+//     * @return 解析结果
+//     */
+//    @Throws(Exception::class)
+//    inline fun <reified T> fromJson(input: InputStream, namingStrategy: PropertyNamingStrategy? = null): T {
+//        val count = input.available()
+//        val buf = ByteArray(count)
+//        var readCount = 0
+//        while (readCount < count) {
+//            readCount += input.read(buf, readCount, count - readCount)
+//        }
+//
+//        return fromJson(String(buf), namingStrategy)
+//    }
+//}

+ 6 - 0
persagy-service-kafka/build.gradle

@@ -47,6 +47,12 @@ dependencies {
     compile group: "org.springframework.kafka",         name: "spring-kafka",                   version: SPRING_KAFKA_VERSION
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+    // JSON解析
+    // https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core
+    implementation group: "com.fasterxml.jackson.core", name: "jackson-core", version: JACKSON_VERSION
+    implementation group: "com.fasterxml.jackson.core", name: "jackson-databind", version: JACKSON_VERSION
+
+    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
     // Sybotan 依赖
     compile group: 'com.persagy', name: 'persagy-kotlin-base', version: PERSAGY_KOTLIN_VERSION
 }