On Friday, September 29, 2017 at 11:09:42 AM UTC+2, Jürgen Beringer wrote:
>
> Hey,
>
> currently I tried the 2. time to move our application from gwt 2.7 to gwt
> 2.8, but I have big problems with the changes of JsInterop.
>
> The application contains a serverside java part, running in a jetty and
> the client part, build with gwt, so I can reuse many software on server and
> client side. (It is the main part of the website www.spreadshirt.com )
> To use also the same data classes (containing only fields with getter and
> setter, no other methods) on both sides, I used JsInterop and it works very
> well with gwt 2.7 and exchanged the data as json.
>
> Example Data class:
>
> @JsType
> public class MyObject {
> private String id;
>
> @JsProperty
> public String getId() {
> return id;
> }
> @JsProperty
> public void setId(String id) {
> this.id = id;
> }
> }
>
>
> The class can be used on server side like any normal java class with any
> REST Framework. On gwt side I was able to convert a transmitted json to the
> class with:
>
>
> MyObject myObject = getJsTypeObject(JsonUtils.safeEval(jsonString));
> //use getter and setter to access fields
>
> public static native <T> T getJsTypeObject(JavaScriptObject result)/*-{
> return result;
> }-*/;
>
>
> And to create Objects on gwt side and send them to the server as json:
>
> MyObject myObject = new MyObject();
> myObject.setId("1");
> String jsonString = stringify(myObject);
>
>
> public static final native String stringify(Object result) /*-{
> return JSON.stringify(result);
> }-*/;
>
>
> I also solved the problem of List and Map with an own Interface, which is
> an ArrayList/HashMap on serverside and an own implemented native List/Map
> on gwt side.
>
> The application has more than 100 such Objects which are heavily used on
> server and client side in many methods which are also be used on both
> sides. So implementing them twice for server and client side would be a big
> overhead.
> Now is my question, how can I convert this gwt 2.7 code to gwt 2.8 (mainly
> to be able to use Java8 syntax in future). I tried multiple variants, but
> it seems for me, JsInterop in gwt 2.8 is not planned for such usecases
> which were possible in gwt 2.7 withou any problems.
> I can either use a native Javascript Object in gwt (native=true) or a in
> GWT created Object in Javascript. But I see no solution to do both with the
> same Type.
>
> I get 2 Problems
>
> - Casting issues: I can't use native=true because I also want to
> create such Objects on gwt side, so on every assignment (jsonString to
> typed variable) I get a cast exception and at least in superdev mode I
> can't deactivate the cast exceptions
>
> If you never do "instanceof" (or expect cast exceptions) on client-side,
you could probably use isNative=true,namespace=GLOBAL,name="Object"; that
way, all your objects are plain old JS objects (no specific
class/constructor is generated in JS), which is actually exactly what you'd
expect from JSON.parse().
>
> - field name problems: The jsonString of the last example is
> {"id_g_$3":"1"} and not {"id":"1"} because the JsProperty for getter and
> setter works only fine with native objects. If I add JsProperty to the
> field itself, I can't do have JsProperty for the getter and setter, so I
> have to add JsIgnore to them. But then when I work with native Objects I
> can't use the getter and setter on gwt side. I would need JsProperty on
> getter, setter and the field itself, but this is also not allowed.
>
>
The "id_g_$3" is probably because you don't -generateJsInteropExports;
contrary to 2.7, in 2.8, the "don't obfuscate @JsProperty/@JsMethod names"
only applies when you -generateJsInteropExports.
But if you switch to isNative=true,namespace=GLOBAL,name="Object", you
don't even need it.
--
You received this message because you are subscribed to the Google Groups "GWT
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/google-web-toolkit.
For more options, visit https://groups.google.com/d/optout.