Передача объекта с сервера на клиент с помощью Vaadin

Я хочу передать объект с сервера клиенту с помощью Vaadin:

Мой объект:

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

Тогда у меня есть расширение компонента AbstractJavaScriptComponent, который имеет это:

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

Функция JavaScript doStuff тогда правильно вызывается, но аргумент, который я получаю, не имеет свойств name а также valueтип аргумента правильный (MyObject).

MyObject является частью WidgetSet (он находится в пространстве имен *.client), хотя я не знаю, является ли это обязательным условием..

Что не так?

2 ответа

Ну просто для справки, я сам на это отвечу

Даже если 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

В callFunction используется подчеркнутый механизм маршала / демаршала JSON. Таким образом, вы должны создать свой транспортный объект для реализации интерфейса "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);
    }
}

Я только что отладил в коде.

Проблема в том, что 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())
Другие вопросы по тегам