diff --git a/convert.html b/convert.html index 0150b2d94..d0d33aa81 100644 --- a/convert.html +++ b/convert.html @@ -99,7 +99,7 @@ final JsonConvert convert = JsonFactory.root().getConvert(); String json = convert.convertTo(user); System.out.println(json); //应该是 {"password":"123456","userid":100,"username":"redkalename"} - UserRecord user2 = convert.convertFrom(UserRecord.class, json); + UserRecord user2 = convert.convertFrom(UserRecord.class, json); System.out.println(convert.convertTo(user2)); //应该也是 {"password":"123456","userid":100,"username":"redkalename"} /** @@ -112,12 +112,12 @@ * } **/ final JsonFactory childFactory = JsonFactory.root().createChild(); - childFactory.register(UserRecord.class, true, "password"); //屏蔽掉password字段使其不输出 - childFactory.reloadCoder(UserRecord.class); //重新加载Coder使之覆盖父Factory的配置 + childFactory.register(UserRecord.class, true, "password"); //屏蔽掉password字段使其不输出 + childFactory.reloadCoder(UserRecord.class); //重新加载Coder使之覆盖父Factory的配置 final JsonConvert childConvert = childFactory.getConvert(); json = childConvert.convertTo(user); System.out.println(json); //应该是 {"userid":100,"username":"redkalename"} - user2 = childConvert.convertFrom(UserRecord.class, json); + user2 = childConvert.convertFrom(UserRecord.class, json); System.out.println(childConvert.convertTo(user2)); //应该也是 {"userid":100,"username":"redkalename"} }

      在RedKale里存在默认的JsonConvert、BsonConvert对象。 只需在所有Service、Servlet中增加依赖注入资源。

@@ -283,13 +283,13 @@ //必须与EnMember[] 顺序一致 private final DeMember[] deMembers = new DeMember[]{ - DeMember.create(factory, InnerCoderEntity.class, "id"), - DeMember.create(factory, InnerCoderEntity.class, "val")}; + DeMember.create(factory, InnerCoderEntity.class, "id"), + DeMember.create(factory, InnerCoderEntity.class, "val")}; //必须与DeMember[] 顺序一致 private final EnMember[] enMembers = new EnMember[]{ - EnMember.create(factory, InnerCoderEntity.class, "id"), - EnMember.create(factory, InnerCoderEntity.class, "val")}; + EnMember.create(factory, InnerCoderEntity.class, "id"), + EnMember.create(factory, InnerCoderEntity.class, "val")}; @Override public void convertTo(Writer out, InnerCoderEntity value) { diff --git a/service.html b/service.html index d7dfc47ab..7a3f0dba7 100644 --- a/service.html +++ b/service.html @@ -152,7 +152,7 @@

Service 远程模式

      动态生成的远程模式UserService:

-
@Resource(name = "")
+            
@Resource(name = "")
 @SncpDyn(remote = true)
 public final class _DynRemoteUserService extends UserService {
 
@@ -185,17 +185,69 @@
         return _client.remote(_convert, _transport, 2, userid);
     }
 
+    @Override
+    public RetResult<UserInfo> login(LoginBean bean) {
+        return _client.remote(_convert, _transport, 3, bean);
+    }
+
     @Override
     public void register(UserInfo user) {
-        _client.remote(_convert, _transport, 3, user);
+        _client.remote(_convert, _transport, 4, user);
     }
 
     @Override
     public UserInfo updateUsername(int userid, String username) {
-        return _client.remote(_convert, _transport, 4, userid, username);
+        return _client.remote(_convert, _transport, 5, userid, username);
     }
 }
                 
+

      由以上代码可以看出来,远程模式Service是根据本地模式Service临时类动态生成的。远程类执行方法时通过SNCP协议将参数序列化并带上当前方法信息传输到远程服务器上,执行完后将结果流反解析并返回, 其流程与WebService类似。与WebService最大的区别在于,远程模式的Service允许修改参数本身的内容。范例如下:

+
/**
+ * 由于该方法在处理过程中修改了参数bean的内容,为了保证本地模式与远程模式的一致性,需要提供@DynCall回调接口
+ *
+ * @param bean
+ * @return
+ */
+public RetResult<UserInfo> login(@DynCall(DynCallLoginBeanAttribute.class) LoginBean bean) {
+    bean.setLogintime(System.currentTimeMillis());
+    bean.setSessionid("SID" + System.currentTimeMillis());
+    // 登陆逻辑
+    return new RetResult<>(100);
+}
+
+
+
+/**  DynCallLoginBeanAttribute 的实现  **/
+public class DynCallLoginBeanAttribute implements Attribute<LoginBean, Object[]> {
+
+    @Override
+    public Object[] get(LoginBean obj) {
+        return new Object[]{obj.getLogintime(), obj.getSessionid()};
+    }
+
+    @Override
+    public void set(LoginBean obj, Object[] value) {
+        obj.setLogintime((Long) value[0]);
+        obj.setSessionid((String) value[1]);
+    }
+
+    @Override
+    public Class<? extends Object[]> type() {
+        return Object[].class; //
+    }
+
+    @Override
+    public Class<LoginBean> declaringClass() {
+        return LoginBean.class; //
+    }
+
+    @Override
+    public String field() {
+        return ""; //可以随意值
+    }
+}
+                
+

      生成远程模式Service时发现参数带有@DynCall注解的方法,在远程调用返回结果时会进行回调处理。