Передача объекта с сервера на клиент с помощью 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())