1

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

}
Manolo Carrasco Moñino
  • 9,723
  • 1
  • 22
  • 27
manstis
  • 123
  • 1
  • 7
  • I read you want to pass instances from one GWT-module to another. I'm building a small project for doing that. Now it's limited to interfaces but can be useful anyway. It's in http://code.google.com/p/gwt-remote/ – helios Sep 26 '11 at 10:38
  • By the way: my stackoverflow profile includes my email. – helios Sep 26 '11 at 10:42

2 Answers2

2

You need no to implement Exportable for Person class.

public class Person {

and it works.

trupanka
  • 693
  • 8
  • 20
  • Great thanks, that worked fine - but only when everything is in a single GWT module. When passing "Person" from one GWT module to another the instance variables of "Person" are undefined :( – manstis Jul 02 '11 at 19:48
  • I don't know. It should work. PluginService module must inherit the PluginCommon module (where Person's source is). PluginCommon module must have – trupanka Jul 02 '11 at 21:32
1

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

manstis
  • 123
  • 1
  • 7