diff --git a/README.md b/README.md index 7687e55..f936503 100644 --- a/README.md +++ b/README.md @@ -7,4 +7,9 @@ > [SDK打包脚本](agentcenter-sdk/build.bat ':include') -> 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar``` \ No newline at end of file +> 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar``` + +--- +#### 兼容性 +当版本不一致时 + > 实体类属性缺失, 使用实体类`Set()`/`Set_s()`函数进行设置 \ No newline at end of file diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java index 86725f8..948f61f 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java @@ -51,9 +51,10 @@ public final class NSMain .setName("测试合同") .setDeptId(187L) .setBookId(166L) - .setOutId(999L) ; - entity.Set("buildingTime", "2000-12-23"); + entity.Parm("buildingTime", "2000-12-25"); + entity.Parm("buildingTime222", "2000-12-11"); + entity.Parm("outId", "123"); result = client.Send(NSProtocol.NS_PROTOCOL_CONTRACTION, entity); System.err.println(result); } diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java index 653a5a9..e28e99a 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java @@ -1,6 +1,7 @@ package com.nsgk.agentcentersdk.api; import cn.hutool.core.util.URLUtil; +import com.nsgk.agentcentersdk.core.NSConstants; import com.nsgk.agentcentersdk.core.NSProtocol; import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.entity.NSEntityBase; @@ -77,10 +78,10 @@ public final class NSSDKClient { String dataStr; - request.ClearHeaders().AddHeader("sign", object.getSign()); - request.ClearQueries().AddQuery("identifier", object.getIdentifier()) - .AddQuery("protocol", object.getProtocol()) - .AddQuery("timestamp", object.getTimestamp()) + request.ClearHeaders().AddHeader(NSConstants.HEADER_SIGN, object.getSign()); + request.ClearQueries().AddQuery(NSConstants.QUERY_IDENTIFIER, object.getIdentifier()) + .AddQuery(NSConstants.QUERY_PROTOCOL, object.getProtocol()) + .AddQuery(NSConstants.QUERY_TIMESTAMP, object.getTimestamp()) ; dataStr = object.getDataStr(); try diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java index 29b873d..5f7dd33 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java @@ -1,5 +1,6 @@ package com.nsgk.agentcentersdk.api; +import com.nsgk.agentcentersdk.core.NSConstants; import com.nsgk.agentcentersdk.core.NSReportObject; import com.nsgk.agentcentersdk.entity.NSEntityBase; import com.nsgk.agentcentersdk.err.NSAssert; @@ -28,20 +29,21 @@ public final class NSSDKServer String sign; String data; - sign = request.getHeader("sign"); + sign = request.getHeader(NSConstants.HEADER_SIGN); NSAssert.NotEmpty(sign, NSErrno.ERRNO_CLI_SIGN_MISSING); data = NSHttp.GetRequestBody(request); NSAssert.NotEmpty(data, NSErrno.ERRNO_CLI_DATA_MISSING); res = new NSReportObject<>(); - res.SetTimestampStr(request.getParameter("timestamp")) - .setIdentifier(request.getParameter("identifier")) - .SetProtocolStr(request.getParameter("protocol")) + res.SetTimestampStr(request.getParameter(NSConstants.QUERY_TIMESTAMP)) + .setIdentifier(request.getParameter(NSConstants.QUERY_IDENTIFIER)) + .SetProtocolStr(request.getParameter(NSConstants.QUERY_PROTOCOL)) ; try { data = NSCrypto.RSADecrypt(data, privateKey); NSAssert.NotEmpty(data, NSErrno.ERRNO_SYS_DECRYPT_FAIL); res.SetDataStr(data, clazz); + NSErrGlobal.ASSERT(res.getData().Normalized() == 0, NSErrno.ERRNO_SYS_INVALID_FIELD); } catch(Exception e) { diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSConstants.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSConstants.java new file mode 100644 index 0000000..92bbe78 --- /dev/null +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSConstants.java @@ -0,0 +1,12 @@ +package com.nsgk.agentcentersdk.core; + +// 常量 +public final class NSConstants +{ + public static final String HEADER_SIGN = "SIGN"; + public static final String QUERY_TIMESTAMP = "timestamp"; + public static final String QUERY_IDENTIFIER = "identifier"; + public static final String QUERY_PROTOCOL = "protocol"; + + private NSConstants() {} +} diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java index aa9dc83..8d791b0 100644 --- a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java +++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java @@ -1,14 +1,19 @@ package com.nsgk.agentcentersdk.entity; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson2.JSON; import com.nsgk.agentcentersdk.err.NSErrGlobal; import com.nsgk.agentcentersdk.err.NSErrno; import com.nsgk.agentcentersdk.utility.NSArr; import com.nsgk.agentcentersdk.utility.NSReflect; +import com.nsgk.agentcentersdk.utility.NSStr; import lombok.Data; import lombok.experimental.Accessors; import java.io.Serializable; import java.lang.reflect.Field; +import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; @@ -28,6 +33,8 @@ public class NSEntityBase implements Serializable /** 外部ID */ protected Long outId; + // 存储其他没有声明的属性, 用于当客户与服务端字段不一致时, 在不更新sdk的情况下, 保持兼容性 + // 不会覆盖已设置的属性 protected Map parms; protected Map PARMS() @@ -89,9 +96,12 @@ public class NSEntityBase implements Serializable } catch(Exception e) { - e.printStackTrace(); + //e.printStackTrace(); + System.err.printf("设置属性字段(%s)失败, 将存储至通用字段", name); } - return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); + //return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); + PARMS().put(name, val); + return false; } // 检查类型 @@ -109,8 +119,135 @@ public class NSEntityBase implements Serializable } catch(Exception e) { - e.printStackTrace(); + //e.printStackTrace(); + System.err.printf("安全设置属性字段(%s)失败, 将存储至通用字段", name); + } + //return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); + PARMS().put(name, val); + return false; + } + + // json反序列化 + @SuppressWarnings("unchecked") + public boolean FromJson(String json) + { + Map map; + + if(NSStr.IsEmpty(json)) + return false; + + map = JSON.parseObject(json, Map.class); + if(CollectionUtil.isEmpty(map)) + return false; + + return FromMap(map); + } + + @SuppressWarnings("unchecked") + public boolean FromMap(Map map) + { + Map p; + Map newParms; + Map newMap; + + if(CollectionUtil.isEmpty(map)) + return false; + + newMap = new HashMap<>(); + map.forEach((k, v) -> { + if(null == k) + return; + newMap.put(NSStr.ToString(k), v); + }); + newParms = new HashMap<>(); + if(newMap.containsKey("parms")) + { + p = (Map)newMap.remove("parms"); + if(CollectionUtil.isNotEmpty(p)) + { + p.forEach((k, v) -> { + if(null == k) + return; + if("parms".equals(k)) // 不递归parms + { + if(v instanceof Map) + ((Map)v).forEach((sk, sv) -> { + if(null == sk) + return; + newParms.put(NSStr.ToString(sk), sv); + }); + return; + } + if(newMap.containsKey(k)) // 不覆盖原属性 + return; + newMap.put(k, v); + }); + } + } + + newMap.put("parms", newParms); + + BeanUtil.fillBeanWithMap(map, this, true); + + return true; + } + + // json序列化 + public String ToJson() + { + return JSON.toJSONString(this); + } + + // 服务端调用, 用来规范化客户端请求, 返回错误数 + public int Normalized() + { + Map newMap; + Map newParms; + int[] res = {0}; + + newMap = new HashMap<>(); + newParms = new HashMap<>(); + if(CollectionUtil.isNotEmpty(parms)) + { + parms.forEach((k, v) -> { + if(null == k) + return; + if("parms".equals(k)) // 不递归parms + { + if(v instanceof Map) + ((Map)v).forEach((sk, sv) -> { + if(null == sk) + return; + newParms.put(NSStr.ToString(sk), sv); + }); + return; + } + Field field = NSReflect.FindField(getClass(), k); + if(null == field) + { + newParms.put(k, v); + } + else + { + try + { + if(!field.isAccessible()) + field.setAccessible(true); + if(null == field.get(this)) + newMap.put(k, v); + } + catch(Exception e) + { + e.printStackTrace(); + res[0]++; + } + } + }); } - return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); + + BeanUtil.fillBeanWithMap(newMap, this, true); + setParms(newParms); + + return res[0]; } }