1

我一直在努力将 Java 对象通过 JSNI(gwt-exporter 生成)从 Java 传递到 Java 中,想知道是否有人可以提供帮助?

我正在用 Java(“Person”)创建一个对象,将它传递给一个 JSNI 方法(“displayPerson”),该方法调用一个用 gwt-exporter 公开的 Java 方法(“CommonService.displayPerson”);但是最后阶段的参数变为空。

如果我传递一个字符串,它可以正常工作;只是我的对象遇到了问题。

Person 定义在由其他 GWT 应用程序继承的 GWT 应用程序 JAR 中。

感谢您的关注,

麦克风

GWT 应用程序

package com.anstis.pluginserver.client;

import com.anstis.plugincommon.shared.Person;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;

public class PluginServer implements EntryPoint {

    public void onModuleLoad() {
        GWT.create(CommonService.class);
        onLoadImpl();

        RootPanel.get("container").add(getButton());
    }

    private native void onLoadImpl() /*-{
    if ($wnd.jscOnLoad && typeof $wnd.jscOnLoad == 'function') $wnd.jscOnLoad();
    }-*/;

    private Button getButton() {
        Button btn = new Button("Click!");
        btn.addClickHandler(new ClickHandler() {

            public void onClick(ClickEvent event) {
                Person p = new Person();
                p.setName("Smurf");
                p.setAge(500);
                displayPerson(p);
            }

        });
        return btn;
    }

    private native void displayPerson(Person person) /*-{
    // The below displays shows 'person' is not null
    alert("PluginServer.displayPerson.person is " + (person != null ? "not " : "") + "null");
    try {
        var pluginServer = new $wnd.com.anstis.pluginserver.CommonService();
        // The below displays shows 'pluginServer' is not null
        alert("PluginServer.displayPerson.pluginServer = " + pluginServer);
        pluginServer.displayPerson(person);
    } catch(err) {
        alert(err);
    }
    }-*/;

}

公共服务.java

package com.anstis.pluginserver.client;

import org.timepedia.exporter.client.Export;
import org.timepedia.exporter.client.Exportable;

import com.anstis.plugincommon.shared.Person;
import com.anstis.plugincommon.shared.PluginCallback;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;

@Export
public class CommonService implements Exportable {

    public void displayPerson(Person person) {
                //The below shows 'person' *IS* null
        Window.alert("CommonService.displayPerson.person is "
                + (person != null ? "not " : "") + "null");
        Window.alert("Name=" + person.getName());
    }

}

人.java

package com.anstis.plugincommon.shared;

import org.timepedia.exporter.client.Exportable;

public class Person implements Exportable {

    private String name;
    private int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}
4

2 回答 2

2

您不需要为 Person 类实现 Exportable。

public class Person {

它有效。

于 2011-07-01T06:05:14.973 回答
1

如果其他人偶然发现了这个问题,我现在在 git://github.com/manstis/gwt-plugins.git 有一个工作示例

于 2011-07-08T20:44:01.907 回答