Spring Roo GWT с инъекцией джина на виджетах, созданных UI: Binder

StackOverflow https://stackoverflow.com/questions/4639835

  •  08-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь получить доступ к некоторым объектам внутри пользовательского интерфейса: связующий компонент, но не уверен в том, как получить доступ к Eventbus, requestfactory, и т. Д., Без написания неприятного кода, который будет держать меня в бодрствовании ночью (также принять к сведению, что я совершенно нового Java, фон в Perl / python / php).

Мой файл ui.xml:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
    xmlns:g='urn:import:com.google.gwt.user.client.ui'
    xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>
    <ui:style>
        ...
    </ui:style>
    <g:HorizontalPanel>
        ...
    </g:HorizontalPanel>
</ui:UiBinder>

Инъекция Eventbus в этом пути выходит из строя с com.ig.client.scaffold.ui.widget.r не имеет конструктора по умолчанию (Zero Args).

public class R extends Composite {

    interface MyUiBinder extends UiBinder<Widget, R> {}
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    private final EventBus eventBus;

    @UiField SimplePanel fieldA, ...;

    @Inject
    public R(EventBus eventBus){
        this.eventBus = eventBus;
        initWidget(uiBinder.createAndBindUi(this));
    }
}

Итак, согласно сообщению об ошибке, я создаю Uifactory, а затем я получаю ошибку ... '{Style.entityComponent}'> Отсутствует требуемый атрибут (ы): элемент eventbus ... (кажется, что он пытается найти EventBus в пользовательском интерфейсе: связующая таблица стилей.

public class R extends Composite {

    interface MyUiBinder extends UiBinder<Widget, R> {}
    private static MyUiBinder uiBinder = GWT.create(MyUiBinder.class);

    private final EventBus eventBus;

    @UiField SimplePanel fieldA, ...;

    public @UiConstructor R(EventBus eventBus){
        this.eventBus = eventBus;
        initWidget(uiBinder.createAndBindUi(this));
    }

    @Inject
    @UiFactory R makeR(){
        return new R(eventBus);
    }
}

От чтения и чтения и читания на чтении за последние пару дней я не видел никого доступа к Eventbus, ShirectactFactory и HistoryController непосредственно в привязке представления с использованием UI: Binder Widget, который привел к выводу, что это, вероятно, не лучшая практика в любом случае.

Допустим, у меня есть ввод, давайте назовем его прокси, прокси содержит ручку, который затем вызывает eventbus.dosomething (). Как связать этот прокси-объект прокси к интерфейсу: Binder Widget без необходимости создавать его или без необходимости передавать его к каждому виджету?

Можно ли сделать инъекцию джина на интерфейсе, а затем реализовать этот интерфейс через класс R, который тогда каким-то образом будет содержать объекты, которые я ищу?

Любое решение, которое желает работать, просто ищет образец (что Java n00b может понять), что в основном позволит мне подключить мой интерфейс с остальными сервисами, созданными ROO.

Спасибо Дж

Это было полезно?

Решение

Проверьте Модель, вид, ведущий шаблон - Это решает эту проблему. Обычно вся неисправна логика должна быть вынуждена выходить из ваших представлений, так что 1) логика неисправности может быть тестирована единицами без запуска внутри (медленно в мгновенном) браузере и 2) разные дисплеи могут быть подключены к тому же приложению без дублирования неисправна логика.

Вот пример MVP, демонстрирующий поведение, которое вы ищете (обратите внимание, что стиль немного отличается от реализации деятельности и мест).

MyPresenter.java:

public class MyPresenter {
  public interface Display extends IsWidget {
    void setButtonClickHandler(ClickHandler buttonClickHandler);
  }

  private final Display display;
  private final EventBus eventBus;

  @Inject
  public MyPresenter(EventBus eventBus,
                     Display display)
  {
    this.display = display;
    this.eventBus = eventBus;

    bind();
  }

  private void bind() {
    display.setButtonClickHandler(new ClickHandler() {
      @Override
      public void onClick(ClickEvent event) {
        eventBus.fireEvent(new MyButtonClickedEvent());
      }
    });
  }

  public void go(HasWidgets container) {
    container.add(display.asWidget());
  }
}

Myview.ui.xml:

<ui:UiBinder xmlns:ui='urn:ui:com.google.gwt.uibinder'
  xmlns:g='urn:import:com.google.gwt.user.client.ui'
  xmlns:ig='urn:import:com.ig.client.scaffold.ui.widget'>

  <g:Button ui:field="myButton"/>
</ui:UiBinder>

Myview.java

public class MyView extends Composite implements MyPresenter.Display {
  interface MyViewUiBinder extends UiBinder<Widget, MyView> {}
  private static MyViewUiBinder uiBinder = GWT.Create(MyViewUiBinder.class);

  private ClickHandler buttonClickHandler = null;

  public MyView() {
    initWidget(uiBinder.createAndBindUi(this));
  }

  @UiHandler("myButton")
  void onButtonClick(ClickEvent event) {
    if (buttonClickHandler != null) {
      buttonClickHandler.onClick(event);
    }
  }

  @Override
  public void setButtonClickHandler(ClickHandler buttonClickHandler) {
    this.buttonClickHandler = buttonClickHandler;
  }
}

И в вашем модуле джина: bind(MyPresenter.Display.class).to(MyView.class);

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top