GWT – JSNI IllegalArgumentException Cannot convert to type

Para organizar el código del cliente utilizo Overlay Types.

En un método intenté regresar un valor de tipo Integer, lo cuál me arrojaba una excepción de tipo IllegalArgumentException.

    public class Sala extends JavaScriptObject{
        public native final Integer getId()/*-{
            return this.id;
        }-*/; 

        public final String getNombre(){
            return JSOHelper.getAttribute(this, "nombre");
        }
        protected Sala() {
        } 

    }

esto es debido a que, en Javascript, el atributo ‘this.id’ es de tipo number y JSNI no puede hacer la conversión automáticamente.
Debemos realizar la conversión de la siguiente manera

    public native final Integer getId()/*-{
        return this.id ? @java.lang.Integer::valueOf(I)(this.id) : null;
    }-*/;

Fuentes:
https://code.google.com/p/google-web-toolkit/issues/detail?id=2972#c6
https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsJSNI#methods-fields
http://docs.oracle.com/javase/1.5.0/docs/guide/jni/spec/types.html#wp16432

Anuncios

GWT – JavaScriptObject overlay types Enum

Si trabajas con GWT y JSON es muy probable que hayas utilizado overlay types. Para utilizar una enumeración en un overlaytype puedes hacerlo de la siguiente manera.

public class Parametro extends JavaScriptObject{

public static enum Tipo{ComboBox,TextBox,Date,ValueList}

protected Parametro() {

}

public native final String getNombre() /-{return this.nombre;}-/;

public native final void setNombre(String nombre) /-{this.nombre = nombre;}-/;

public native final String getTitulo() /-{return this.titulo;}-/;

public final native void setTitulo(String titulo) /-{this.titulo = titulo;}-/;

public final Tipo getTipo(){

    return Tipo.valueOf(getNativeTipo());

}

public native final String getNativeTipo() /-{return this.tipo}-/;

public final void setTipo(Tipo tipo){

    setNativeTipo(tipo.toString());

}

public native final void setNativeTipo(String tipo) /-{this.tipo = tipo;}-/;

}

Notesé que la propiedad Tipo es un enum, lo que hicimos fue agregar los métodos JSNI getNativeTipo y setNativeTipo que utilizan el tipo de dato String -que es soportado en javascript- y lo convertimos a su valor de la enumeración en los métodos getTipo y setTipo respectivamente.

Fuentes:
http://www.mail-archive.com/google-web-toolkit@googlegroups.com/msg50923.html
https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsOverlay