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 @@动态生成的远程模式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注解的方法,在远程调用返回结果时会进行回调处理。