使用Vaadin将对象从服务器传递到客户端

问题描述 投票:0回答:3

我想用Vaadin将对象从服务器传递给客户端:

我的目标:

public class MyObject {
    public String name;
    public int value;
}

然后我有一个扩展AbstractJavaScriptComponent的组件,其中包含:

public void doStuff(MyObject obj) {
    callFunction("doStuff", obj);
}

然后正确调用JavaScript函数doStuff,但我得到的参数没有属性namevalue,参数的类型是正确的(MyObject)。

MyObject是WidgetSet的一部分(它位于* .client命名空间中),但我不知道这是否是必须的.​​.

出了什么问题?

javascript vaadin vaadin7
3个回答
0
投票

嗯,仅供参考,我会自己回答:

即使callFunction说它可以处理Objekts / JavaBeans,但在我看来它实际上不能。但这种方式有效:

把这样的东西放在你的WidgetSet中:

public interface MyComponentClientRpc extends ClientRpc {
    public void doStuff(MyObject obj);
}

然后使用callFunction代替getRpcProxy(MyComponentClientRpc.class).doStuff(obj);

并在JS-Connector中添加这样的内容:

this.registerRpc({
    doStuff : function(obj) {
        alert(obj);
    },
});

我在这里了解到:https://vaadin.com/de/wiki/-/wiki/Main/Using%20complex%20Java%20types%20from%20JavaScript


0
投票

callFunction使用下划线JSON marshal / unmarshal机制。所以你应该让你的传输对象实现“org.json.JSONString”接口。例如

public class MyObject implements JSONString, Serializable {
    public String name;
    public int value;

    @Override
    public String toJSONString() {
        return String.format("{\"name\":\"%s\",\"value\":%d}", name, value);
    }
}

0
投票

我刚刚调试了代码。

问题是callFunction()接受了Object[]。因此,JsonCodec作为提示获得的类型是Object.class而不是Object[]中项目的类型。

我现在发现了一个肮脏的解决方法:

MyOptions options = new MyOptions();
options.foo = "bar";
options.count = 1;
callFunction("myFunction",
             JsonCodec.encode(options , null, MyOptions.class, null).getEncodedValue())
© www.soinside.com 2019 - 2024. All rights reserved.