Search code examples
gwtjsnigwt-exporter

GWT: gwt-exporter: passing objects


I've been struggling with passing Java objects from Java through JSNI (gwt-exporter generated) into Java and wonder if anybody can help?

I am creating an object in Java ("Person"), passing it to a JSNI method ("displayPerson") that invokes a Java method exposed with gwt-exporter ("CommonService.displayPerson"); however the parameter to the last stage becomes null.

If I pass a String it works OK; it's just with my objects I hit the problem.

Person is defined in a GWT application JAR inherited by the other GWT application.

Thanks for looking,

Mike

GWT application

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);
    }
    }-*/;

}

CommonService.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());
    }

}

Person.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;
    }

}

Solution

  • If anybody else stumbles across this question, I now have a working example at git://github.com/manstis/gwt-plugins.git