Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

接口方法参数List<User>,调用后,后端变成了List<hashMap>了,导致类型不对报错,不知道什么原因? #25

Closed
15168326318 opened this issue Jun 13, 2018 · 10 comments

Comments

@15168326318
Copy link

1.后端方法

qqqqqqqq

2.ts文件如下:
ts

3.前端调用:
qq 20180613172904

4.结果是List,而不是参数类型List.所以导致类型转换报错。而且bigDecimal值也不对:100.06变成1了

aaaaa

@15168326318 15168326318 changed the title 接口方法参数List<User>,调用后,后端变成了List<hashMap>了,导致报错,不知道什么原因? 接口方法参数List<User>,调用后,后端变成了List<hashMap>了,导致类型不对报错,不知道什么原因? Jun 13, 2018
@creasy2010
Copy link
Contributor

@15168326318
试下这种方式呢.
java('java.util.List',[
java('com.xxxx.User', {
name: 'bar' ,
id:33
.....
});
])

转换时 , 如果不是翻译师生成的对象(如:list ,) 会直接把参数返回. 所以new user 会处理错误..

@hufeng
Copy link
Member

hufeng commented Jun 13, 2018

@15168326318 我来定位下。

@creasy2010
Copy link
Contributor

或者这种方式
java('java.util.List',[
new User(...).__fields2java()
])

我们提倡的最佳实践是单参数. 这样能避免很多问题..

@15168326318
Copy link
Author

@creasy2010 你们应该按alibaba的dubbo支持的参数来实现,他们是没限制的。 微服务dubbo不太可能按你们的限制来做的,对吧。

@creasy2010
Copy link
Contributor

@15168326318 是的,只是建议;
 传任意参数都是可以调通的,但 开发体验却没那么好,就像你这个例子,我们在开发过程中需要关注hessian.js能识别的对象结构 而不是本能的写一个javascript的对象;
目前我们还没想到好的方案打通这一点?

@lileilei
Copy link

@creasy2010

var combineArray = function (type, value) {
  var values = null;
  if (value) {
    values = [];
    for (var i = 0, len = value.length; i < len; i++) {
      values.push(combine(type, value[i]));
    }
  }
  return {
    $class: '[' + (type.name || type),
    $: values
  };
};
`

values.push(combine(type, value[i]));的时候判断一下是否有__fields2java方法有则调用不知道能否解决这个问题?

@creasy2010
Copy link
Contributor

creasy2010 commented Jun 29, 2018

这是 Js-to-java模块的逻辑?

@lileilei
Copy link

lileilei commented Jul 3, 2018

@creasy2010 是的。应该阔以哦

@creasy2010
Copy link
Contributor

你看的真仔细,, 哈哈,
确实是可以的, 而且有一个更好的位置 .放这段逻辑 .. 下面会详细说明

上次跟胡峰讨论过这件事, 我把讨论的内容和例子在这里阐明下...

转换基本类型数据示例

翻译师其实做了两件事,

  1. 编译时, 把java接口代码转换为typescript文件;
  2. 运行时, 把js对象转换为hession.js协议能识别的对象;

而此issue中一直就是围绕2讨论, 因为针对java的基本类型, 我们并没有生成转换代码,需要手工去写hession.js识别的结构;

我们可以在argumentMap 方法中写转换的逻辑 .

示例代码

 
export const DemoProviderWrapper = {
  sayHello: argumentMap,
  test: argumentMap,
  echo: argumentMap,
  getUserInfo: argumentMap,
};

你上面的例子伪代码如下:

export const DemoProviderWrapper = {
  �getUserList:(userList:Array<User>)=>{
      // 注: 转换的逻辑是自动生成的 
      // TODO null undefinded的情况还要排除
      return java('java.util.List',userList.map(user=>user.__fields2java()));
   },
};

但是 遇到java多态 就变得麻烦了... 这也这是为什么现在没有做这一块...

为什么没有做

估算下. 上面的解决方案能解决97%的场景, 但碰到java多态就会被"破功"了.. 尤其是参数类型不能通过次序+类型来判断的情况 ,
@lileilei

@CodeLittlePrince
Copy link

建议把这个场景放在demo里,一个上午老泪纵横 T T

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

5 participants