[ovirt-devel] Frontend code - introducing GinUiBinder

Vojtech Szocs vszocs at redhat.com
Mon Dec 1 20:01:46 UTC 2014

Hi guys,

Martin's GinUiBinder patch [1] just landed into master branch.

[1] http://gerrit.ovirt.org/#/c/34954/

This patch allows the use of dependency injection for widgets
declared in GWT UiBinder templates.

Let's take a look at AbstractVmPopupWidget.ui.xml template:

  <vm:SerialNumberPolicyWidget ui:field="serialNumberPolicyEditor"/>

Inside the "owner" widget, AbstractVmPopupWidget class:

  @UiField(provided = true) // we need manual instantiation
  public SerialNumberPolicyWidget serialNumberPolicyEditor;

We use "provided = true" in order to manually instantiate
SerialNumberPolicyWidget, because this widget accepts some
constructor parameters:

  public SerialNumberPolicyWidget(
    CommonApplicationTemplates applicationTemplates,

So in AbstractVmPopupWidget, we need to do following:

  serialNumberPolicyEditor = new SerialNumberPolicyWidget(...)

The "provided = true" + "new SerialNumberPolicyWidget(...)"
is essentially a boilerplate that adds to overall complexity.

Now, let's revisit above example using GinUiBinder. First,
in AbstractVmPopupWidget class:

  @UiField // no need for manual instantiation
  public SerialNumberPolicyWidget serialNumberPolicyEditor;

Then, in SerialNumberPolicyWidget class:

  @Inject // inject dependencies into this widget
  public SerialNumberPolicyWidget(
    CommonApplicationTemplates applicationTemplates,

And finally, we can remove following line:

  // this is no longer needed, GinUiBinder handles it for us
  serialNumberPolicyEditor = new SerialNumberPolicyWidget(...)

The complete example can be seen here:


I encourage every UI maintainer to revisit existing code with
regard to @UiField(provided = true) and refactor/improve it to
take advantage of @Inject in specific widget classes.

Let me (or Martin) know if you have any questions.


More information about the Devel mailing list